1

我建立了自定义编辑字段,因为我想更改背景颜色。

显示不稳定,有时对焦时显示,失焦时消失。

我想要第三张图像的结果,其中聚焦的位置也静态显示所有字段。

这是我的Custom_EditField

public class Custom_EditField extends EditField {
private int width, row, color;
private boolean isfocus;

Custom_EditField(long style, int width, int row) {
    super(style);
    this.width = width;
    this.row = row;
}

public int getPreferredHeight() {
    return Font.getDefault().getHeight() * row;
}

public int getPreferredWidth() {
    return width;
}

protected void onFocus(int direction) {
    color = Color.GRAY;
    isfocus = true;
}

protected void onUnfocus() {
    color = Color.GOLD;
    isfocus = false;
}

protected void layout(int maxWidth, int maxHeight) {
    super.layout(maxWidth,
            Math.min(maxHeight, Font.getDefault().getHeight() * row));
    super.setExtent(maxWidth,
            Math.min(maxHeight, Font.getDefault().getHeight() * row));
}

protected void paint(Graphics graphics) {
    int rectHeight = getPreferredHeight();
    int rectWidth = getPreferredWidth();
    try {
        if (isfocus) {
            graphics.setBackgroundColor(color);
        } else {
            graphics.setBackgroundColor(color);
        }
        color = Color.BLACK;
        graphics.setColor(color);
        graphics.drawRect(0, 0, rectWidth, rectHeight);
        super.paint(graphics);
    } finally {
        graphics.setColor(color);
    }
}
}
4

2 回答 2

1

我不是 100% 确定您要问的是哪个问题:

  • 如何绘制自己的焦点背景颜色EditField,或
  • 如何解决移动焦点时字段消失的问题

1)如果这是第二个问题(消失),那么我猜您遇到的问题与其他问题相同,Custom_TopField 按钮消失了

因此,如果这些Custom_EditField对象是由扩展的管理器创建的VerticalFieldManager,但也实现sublayout()了自身以执行所有定位,那么请尝试我在另一个问题中建议的解决方案(不要扩展VerticalFieldManager,只需扩展Manager)。

2) 如果这不起作用,则可能是您的paint()方法没有在应该触发的时候被触发。尝试invalidate()在你的焦点方法中添加一个调用,以及对超类方法的调用onFocus()onUnfocus()

protected void onFocus(int direction) { 
    color = Color.GRAY; 
    isfocus = true; 
    invalidate();
    super.onFocus(direction);
} 

protected void onUnfocus() { 
    color = Color.GOLD; 
    isfocus = false; 
    invalidate();
    super.onUnfocus();
} 

3)而且,您可能还需要实现这一点:

public boolean isFocusable() {
    return true;
}

但是,首先,检查您的经理课程,以确保这与您的其他问题不同。

还 ...

在本课程中,您将编辑字段的高度基于行号。这真的是你想要的吗?第 0 行的大小为 0,之后的每一行都会越来越高。这真的是用户界面吗?通常,您会让所有行的编辑字段大小相同,并使用不同的y offset简单地布置它们。最有可能的是,这个类不需要知道row它被放置在哪个类上。该信息通常由管理器对象负责。

于 2012-07-06T07:45:44.270 回答
0
protected EditField getEditField() {

    EditField edit_field = new EditField("", "", 10, EditField.NO_NEWLINE
            | BasicEditField.FIELD_VCENTER) {


        protected boolean navigationClick(int status, int time) {

        }

        protected void onFocus(int direction) {
            Set the boolean during focus
        }

        protected void onUnfocus() {

        }

        protected void paintBackground(Graphics graphics_paint) {
            if(that boolean is true)
                  {
                       Set your custom background during focus.
                  }else{
                       Set your custom background during unfocus.
                  }
        }

        protected void paint(Graphics graphics_paint) {
            int old_color = graphics_paint.getColor();
            try {
                if(that boolean is true)
                  {
                       Set your custom Font color during any event like focus and click.
                  }else{
                       Set your custom background Font color during any event like unfocus.
                  }
                super.paint(graphics_paint);
            } finally {
                graphics_paint.setColor(old_color);
            }
        }

        public void layout(int width, int height) {

        }
    };
于 2012-07-05T10:32:48.857 回答