親マネージャーにフォーカスがあるときに、ListField 内の LabelField テキストに色を付けるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1267842

質問

ListField 内の項目を抑制する必要があるか、現在抑制する必要があるかに基づいてフォントの色を変更できる、オーバーライドされた LabelField があります。LabelField の色を控えめにするのは効果的です。ただし、ListField で行 (LabelField を含む) が強調表示されている場合、ラベル フィールドの色を異なる色または反転したいと思います。

これが私のコードです:

public class MyLabelField extends LabelField{

public MyLabelField (String s, long l){
    super(s, l);
    m_bSubdue = true; // this value does change in implementation but not in this sample
}

protected void paint(Graphics g)
{
    if(m_bSubdue && !this.isFocus()){  // this isFocus() trick is not working
        int color = 0x00696969; // RGB val
        g.setColor(color);
    }
    super.paint(g);
}

boolean m_bSubdue;

}

このサンプルでは、​​MyLabelField をグレーの色で描画したいと考えていますが、それに含まれる ListField 行にフォーカスがある場合、その色をデフォルトの LabelField ペイントにして白にしたいと考えています。

コードをテストしたところ、LabelField の親行にフォーカスがある場合、LabelField はフォーカスを取得しないようです。もしかしたら、コードのどこかに変更が必要になるかもしれません...

役に立ちましたか?

解決

LabelField の色を切り替えるには、Paint() メソッドで選択されているかどうかを確認できます。ただし、その場合でも、ListField のすべての行を再描画する必要があります。そしてそれが問題です:ListField の行選択が変更されるたびに、ListFieldCallback.drawRow() メソッドの呼び出しは 2 回だけです。1 回目は以前に選択された行 (まだ選択状態にある) に対して、2 回目は新しく選択された行 (既に選択状態にある) に対して行われます。

以前に選択した行インデックスを保存し、drawRow() を呼び出すたびに再描画しようとしましたが、何らかの理由で LabelField.paint() メソッドがトリガーされませんでした。

そこで私は、シンプルだがどこか醜い解決策を提案します。スケジュール ListField.invalidate() タイマータスク。期間は 100 ミリ秒で十分ですが、パフォーマンスにはそれほど影響しません。

Jason Emerick のコードは、ListField を拡張するためのガイドとして使用されています。

class LabelListField extends ListField implements ListFieldCallback {
    private Vector mValues;
    private Vector mRows;

    public LabelListField(Vector values) {
        super(0);
        setRowHeight(70);
        setCallback(this);

        mValues = values;
        fillListWithValues(values);

        scheduleInvalidate();
    }

    private void scheduleInvalidate() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                invalidate();
            }
        }, 0, 100);
    }

    private void fillListWithValues(Vector values) {
        mRows = new Vector();
        for (int i = 0; i < values.size(); i++) {
            TableRowManager row = new TableRowManager();
            String title = "Item# " + String.valueOf(i + 1);
            LabelField titleLabel = new LabelField(title);
            titleLabel.setFont(Font.getDefault().derive(Font.BOLD));
            row.add(titleLabel);
            String value = (String) values.elementAt(i);
            ListLabel valueLabel = new ListLabel(this, i, value);
            valueLabel.setFont(Font.getDefault().derive(Font.ITALIC));
            row.add(valueLabel);
            mRows.addElement(row);
        }
        setSize(mRows.size());
    }

    private class TableRowManager extends Manager {
        public TableRowManager() {
            super(0);
        }

        public void drawRow(Graphics g, int x, int y, 
            int width, int height) {
            layout(width, height);
            setPosition(x, y);
            g.pushRegion(getExtent());
            paintChild(g, getField(0));
            paintChild(g, getField(1));
            g.popContext();
        }

        protected void sublayout(int width, int height) {
            int fontHeight = Font.getDefault().getHeight();
            int preferredWidth = getPreferredWidth();
            Field field = getField(0);
            layoutChild(field, preferredWidth - 5, fontHeight + 1);
            setPositionChild(field, 5, 3);
            field = getField(1);
            layoutChild(field, preferredWidth - 5, fontHeight + 1);
            setPositionChild(field, 5, fontHeight + 6);
            setExtent(preferredWidth, getPreferredHeight());
        }

        public int getPreferredWidth() {
            return Display.getWidth();
        }

        public int getPreferredHeight() {
            return getRowHeight();
        }
    }

    public void drawListRow(ListField listField, Graphics g, 
            int index, int y, int width) {
        LabelListField list = (LabelListField) listField;
        TableRowManager rowManager = (TableRowManager) list.mRows
                .elementAt(index);
        rowManager.drawRow(g, 0, y, width, list.getRowHeight());

    }

    public Object get(ListField list, int index) {
        return mValues.elementAt(index);
    }

    public int indexOfList(ListField list, String prefix, int start) {
        for (int x = start; x < mValues.size(); ++x) {
            String value = (String) mValues.elementAt(x);
            if (value.startsWith(prefix)) {
                return x;
            }
        }
        return -1;
    }

    public int getPreferredWidth(ListField list) {
        return Display.getWidth();
    }

    class ListLabel extends LabelField {
        int mIndex = -1;

        public ListLabel(LabelListField list, int index, String text) {
            super(text);
            mIndex = index;
        }

        protected void paint(Graphics graphics) {
            if (getSelectedIndex() == mIndex)
                graphics.setColor(Color.RED);
            else
                graphics.setColor(Color.BLUE);
            super.paint(graphics);
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top