Come faccio a colore del testo all'interno di un labelField ListField quando il manager genitore ha il focus?

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

Domanda

Ho un labelField override che mi permette di cambiare il colore del carattere in base a se un elemento a mio ListField deve essere sottomesso o adesso. Rendere il colore labelField sommesso grandi opere. Ma, quando la riga (che contiene il mio labelField) è evidenziato nella ListField, vorrei il colore campo etichetta di essere diversi o invertito.

Qui è il mio codice:

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 questo esempio, vorrei MyLabelField essere disegnati con un colore grigio, ma quando il ListField riga il suo contenuto in ha il focus, vorrei il colore di default per labelField vernice che dovrebbe rendere più bianchi.

In base a test il mio codice, sembra che il labelField non ottenere la messa a fuoco quando la sua riga padre ha il focus. Forse un cambiamento è necessario da qualche altra parte nel mio codice ...

È stato utile?

Soluzione

Per passare il colore del labelField possiamo controllare se è stato selezionato nella sua metodo paint (). Ma anche allora dovremo ridisegnare ogni riga ListField. E questo è il problema: ogni volta selezione di riga di ListField è cambiato, ci sono solo due chiamate di ListFieldCallback.drawRow () Metodo - prima per previous riga selezionata (ancora in stato selezionato) e secondo per nuova riga selezionata (già stato selezionato) ...

Ho cercato di salvare precedente indice di riga selezionata e ridisegnare su ogni chiamata di drawRow (), ma da qualche metodo ragione LabelField.paint () non è stato attivato, allora.

Quindi, io vengo con semplice in qualche modo brutto soluzione: programma ListField.invalidate () TimerTask. Periodo in 100 ms è sufficiente e non ha colpito le prestazioni pure.

codice di Jason Emerick Sono stato usato come una guida per esteso 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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top