丸みを帯びた長方形の背景を適切に描画するだけで大変な作業になるのはちょっとばかげていますが、他の人もこの問題を抱えているEditField
ようです
ソリューション1
Peter Strangeの回答をその質問に適合させると、コードは以下のようになりMobEditField
ます。多くのコードが追加されたため、匿名EditField
クラスを別のクラスに分割しました。本当に必要な場合は、コードを匿名クラスとして保持することができます(これは読みやすさにとって非常に悪いと思います)。
private class MobEditField extends EditField {
private boolean _drawFocus = false;
public MobEditField() {
super("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE);
}
protected void paint(Graphics graphics) {
if (!_drawFocus) {
int oldColor = graphics.getColor();
graphics.setColor(Color.WHITE);
graphics.fillRoundRect(0, 0, getWidth() - (getWidth() / 10), getHeight(), 5, 5);
graphics.setColor(Color.BLACK);
graphics.drawText(getText(), 0, 0);
graphics.setColor(oldColor);
}
super.paint(graphics);
}
protected void drawFocus(Graphics graphics, boolean on) {
_drawFocus = on;
super.drawFocus(graphics, on);
_drawFocus = false;
}
protected void onFocus( int direction ) {
super.onFocus( direction );
invalidate();
}
protected void onUnfocus() {
super.onUnfocus();
invalidate();
}
}
その後、あなたはただする:
ef_mob = new MobEditField();
いくつかのことに注意してください。
ef_mob.getText()
匿名クラスのpaint()
メソッド内から呼び出さないでください。だけお電話getText()
ください。元のコードがどのようにコンパイルされたかはわかりません。
- メソッドをオーバーライドするときは、最初のオブジェクトの色(またはアルファ、または変更したもの)
paint()
を保存して、最後にリセットするのが最善です。Graphics
onFocus()
およびメソッドは、onUnfocus()
強制的に再描画するためにオーバーライドされます
- この
paint()
方法でsuper.paint()
は、フィールドに焦点を合わせたときにすべての作業を実行できます。フィールドの外観によっては、これを少し調整する必要がある場合があります。
解決策2
私のために働いた別の選択肢は、文書化され paintBackground()
ていない方法を利用することEditField
です。もちろん、文書化されていない方法を使用することには常に欠点があります。だから、私はそれをオプションとしてのみ提供します:
ef_mob = new EditField("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE) {
protected void paint(Graphics graphics) {
int oldColor = graphics.getColor();
graphics.setColor(Color.BLACK);
graphics.drawText(getText(), 0, 0);
graphics.setColor(oldColor);
super.paint(graphics);
}
protected void paintBackground(Graphics g) {
int oldColor = g.getColor();
g.setColor(Color.WHITE);
g.fillRoundRect(0, 0, getWidth()-(getWidth()/10), getHeight(), 5, 5);
g.setColor(oldColor);
}
};
ここで、fillRoundRect()
呼び出しをに移動paint()
しましたpaintBackground()
。