我构建了自定义编辑字段,因为我想更改背景颜色。
第一、第二和第三显示不稳定,有时在对焦时显示,在失焦时消失。
我想要像第三张图像这样的结果,其中焦点也静态显示所有字段。
这是我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);
}
}
}
我不是 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 偏移量对它们进行布局。 最有可能的是,这个类应该不需要知道它被放在哪个row
上。 该信息通常是管理器对象的责任。
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) {
}
};