1

背景色を変更したいので、カスタム編集フィールドを作成しました。

1 番目2 番目3 番目の表示が不安定で、ピントを合わせると表示されることがあり、ピントが合わないと表示が消えます。

3 番目の画像のように、どこに焦点を合わせても静的にすべてのフィールドが表示される結果が必要です。

これが私のもの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) 2番目の問題(消える)の場合、ボタンが消えて、他の質問と同じ問題が発生していると思いますCustom_TopField

したがって、これらのCustom_EditFieldオブジェクトが拡張するマネージャーによって作成されているが、すべてのポジショニングを実行するためにそれ自体をVerticalFieldManager実装している場合は、他の質問で提案した解決策を試してください(拡張しないでください。拡張するだけです)。sublayout()VerticalFieldManagerManager

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サイズになり、その後の各行はますます高くなります。それは本当にUIですか?通常、すべての行の編集フィールドは同じサイズで、異なるyオフセットでレイアウトするだけです。ほとんどの場合、このクラスは、どちらに配置されているかを知る必要はありません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 に答える