Comment puis-je couleur du texte LabelField dans un ListField lorsque le gestionnaire de parent a le focus?

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

Question

J'ai une LabelField surchargée qui me permet de changer la couleur de police basée sur si un élément dans mon ListField devrait être atténué, ou maintenant. Faire la couleur LabelField tamisée fonctionne très bien. Mais, lorsque la ligne (qui contient mon LabelField) est mis en évidence dans le ListField, je voudrais la couleur de champ étiquette différente ou inversée.

Voici mon 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;

}

Dans cet exemple, je voudrais MyLabelField à tirer avec une couleur grise, mais lorsque la ListField rangée de son contenu dans le focus, je voudrais la couleur par défaut de peinture LabelField qui devrait le rendre blanc.

D'après les tests mon code, il semble que le LabelField ne soit pas le focus lorsque la ligne parent a le focus. Peut-être un changement est nécessaire quelque part ailleurs dans mon code ...

Était-ce utile?

La solution

Pour changer la couleur de LabelField nous pouvons vérifier si elle est sélectionnée dans sa méthode de peinture (). Mais même alors nous allons devoir repeindre toutes les lignes de ListField. Et c'est le problème: chaque sélection de ligne de temps de ListField est changé, il n'y a que deux appels de méthode ListFieldCallback.drawRow () - d'abord pour la ligne précédente sélectionnée (toujours en état sélectionné) et deuxième pour la nouvelle ligne sélectionnée (déjà en état sélectionné) ...

J'ai essayé de sauver l'index précédent de ligne sélectionnée et redessiner à chaque appel de drawRow (), mais par une méthode LabelField.paint () raison n'a pas été déclenchée alors.

Je viens donc avec une solution simple, en quelque sorte laid: calendrier ListField.invalidate () TimerTask. Période 100 ms est suffisant et ne performances pas touché aussi bien.

code de Jason Emerick J'ai utilisé comme guide pour ListField étendu.

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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top