¿Cómo puedo LabelField color del texto dentro de un ListField cuando el gerente de los padres tiene el foco?

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

Pregunta

Tengo una LabelField sobrescrito que me permite cambiar el color de fuente en función de si un artículo en mi ListField debe ser sometida ni ahora. Haciendo que el color LabelField sometido funciona muy bien. Pero, cuando la fila (que contiene mi LabelField) se destaca en la ListField, me gusta el color campo de etiqueta de ser diferente o invertida.

Aquí está mi código:

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;

}

En este ejemplo, me gustaría MyLabelField ser dibujado con un color gris, pero cuando el ListField fila su contenido en cuenta el enfoque, me gustaría que el color por defecto para dibujar LabelField que debería hacer más blanco.

Con base en las pruebas de mi código, parece que el LabelField no obtener el foco cuando su fila superior tiene el foco. Tal vez se necesita un cambio en otra parte de mi código ...

¿Fue útil?

Solución

Para cambiar el color de LabelField podemos comprobar si se ha seleccionado en el mismo método () es la pintura. Pero incluso entonces vamos a tener que volver a pintar cada fila de ListField. Y ese es el problema: se cambia cada selección de filas momento de ListField, sólo hay dos llamadas de método ListFieldCallback.drawRow () - en primer lugar para la fila seleccionada anterior (aún en estado seleccionado) y el segundo para la nueva fila seleccionada (ya en estado seleccionado) ...

He intentado salvar anterior índice de la fila seleccionada y volver a dibujar en cada llamada de drawRow (), pero por alguna razón método LabelField.paint () no se activó entonces.

Así que venga con una solución sencilla, de alguna manera fea: horario ListField.invalidate () TimerTask. Periodo en 100 ms es suficiente y no golpea el rendimiento también.

código de Jason Emerick He sido utilizado como una guía para ListField extendida.

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);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top