Wie Farbe, die ich Labelfield Text innerhalb einer Listfield, wenn der übergeordnete Manager den Fokus hat?

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

Frage

Ich habe eine überschriebene Labelfield, die mir die Schriftfarbe auf, ob ein Element in meinem Listfield basierend ändern können soll oder jetzt gedämpft werden. Herstellung der Farbe gedämpft Labelfield funktioniert super. Aber, wenn die Zeile (enthält mein Labelfield) in der Listfield markiert ist, würde ich das Beschriftungsfeld Farbe mag andere oder umgekehrt sein.

Hier ist mein Code:

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;

}

In diesem Beispiel würde ich MyLabelField gerne mit einer grauen Farbe gezeichnet werden, aber wenn die Listfield seiner Zeile enthielt in den Fokus hat, würde ich die Farbe gerne Labelfield Farbe auf Standard, die es weiß machen sollen.

Basierend auf meinen Code zu testen, wie es scheint der Labelfield den Fokus nicht erhalten, wenn seine Eltemzeile den Fokus hat. Vielleicht wird eine Änderung woanders in meinem Code benötigt ...

War es hilfreich?

Lösung

Zum Umschalten Farbe Labelfield können wir überprüfen, ob es ausgewählt ist darin paint () Methode ist. Aber selbst dann werden wir jede Zeile in Listfield neu streichen müssen. Und das ist das Problem: Jedes Mal, Zeilenauswahl von Listfield geändert wird, gibt es nur zwei Anrufe von ListFieldCallback.drawRow () -Methode - zuerst für die vorherigen ausgewählten Zeile (noch in ausgewählten Zustand) und eine zweite für neu gewählte Zeile (bereits in ausgewählten Zustand) ...

Ich habe versucht, vorher ausgewählten Zeilenindex zu speichern und bei jedem Aufruf von drawRow () neu zu zeichnen, aber aus irgendeinem Grunde LabelField.paint () -Methode wurde dann nicht ausgelöst.

Also ich komme mit einfacher, irgendwie hässlich Lösung: Zeitplan ListField.invalidate () Timertask. Zeitraum in 100 ms genügt und nicht so gut getroffen Leistung.

Jason Emerick Code Ich habe als Leitfaden für die erweiterte Listfield verwendet.

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);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top