3

Editfieldにカーソルが表示されていません。

以下はコードです。

ef_mob = new EditField("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE) {
   protected void paint(Graphics graphics) {
      graphics.setColor(Color.WHITE);
      // graphics.drawRoundRect(0, 0, getWidth()-(getWidth()/10), getHeight(), 5, 5);

      graphics.fillRoundRect(0, 0, getWidth()-(getWidth()/10), getHeight(), 5, 5);
      graphics.setColor(Color.BLACK);

      graphics.drawText(ef_mob.getText(), 0, 0);
      super.paint(graphics);
   }
};

何が問題ですか?

4

1 に答える 1

4

丸みを帯びた長方形の背景を適切に描画するだけで大​​変な作業になるのはちょっとばかげていますが、他の人もこの問題を抱えている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();

いくつかのことに注意してください。

  1. ef_mob.getText()匿名クラスのpaint()メソッド内から呼び出さないでください。だけお電話getText()ください。元のコードがどのようにコンパイルされたかはわかりません。
  2. メソッドをオーバーライドするときは、最初のオブジェクトの色(またはアルファ、または変更したもの)paint()を保存して、最後にリセットするのが最善です。Graphics
  3. onFocus()およびメソッドは、onUnfocus()強制的に再描画するためにオーバーライドされます
  4. この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()

于 2012-08-15T23:33:40.867 に答える