Нестабильный пользовательского поля редактирования

Я создал собственное поле для редактирования, потому что я хочу изменить цвет фона.

первый, второй и третий показываются нестабильно, иногда отображаются при фокусировке, исчезают при потере фокусировки.

Я хочу получить результат, подобный третьему изображению, на котором фокусировка и статическое отображение всего поля.

Вот мой 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);
    }
}
}

2 ответа

Решение

Я не уверен на 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) {

        }
    };
Другие вопросы по тегам