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,但看起来其他人也遇到了这个问题

解决方案一

如果您调整 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对象颜色(或 alpha,或您更改的任何内容),然后在最后重置它。
  3. 和方法被onFocus()覆盖onUnfocus()以强制重绘
  4. paint()方法只允许super.paint()在关注该领域时完成所有工作。根据您希望字段的外观,您可能需要稍微调整一下。

解决方案二

对我有用的另一种选择是利用未记录 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 回答