Domanda

Ho un JList che utilizza DefaultListModel e popolarlo con gli oggetti che ricevo da un elenco (contesto: gli oggetti sono un tipo di agente nel sistema ABM)

.

E 'possibile cambiare il nome che è mostrato per gli oggetti nel JList? Non sono stato in grado di trovare qualsiasi cosa su questo ...

È stato utile?

Soluzione

Se le informazioni che si desidera visualizzare (al posto di qualunque toString () sputa fuori) è contenuto nell'oggetto stesso, il modo più diretto "Swing" per raggiungere questo obiettivo è attraverso l'uso di un ListCellRenderer . Pensate ad un ListCellRenderer (qualsiasi CellRenderer veramente) come un timbro di gomma utilizzata per disegnare ogni oggetto nella tua lista. L'oggetto viene passato, si imposta il componente, il componente disegna l'oggetto, e poi si sposta al prossimo oggetto. Il CellRenderer non ha mai qualsiasi stato.

Si consideri questo esempio:

// Extend DefaultListCellRenderer, takes care of most of the work for you
public class ExampleListCellRenderer extends DefaultListCellRenderer
{
    public Component getListCellRendererComponent(
        JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        // I know DefaultListCellRenderer always returns a JLabel
        // super setups up all the defaults
        JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelect, cellHasFocus);

        // "value" is whatever object you put into the list, you can use it however you want here

        // I'm going to prefix the label text to demonstrate the point

       label.setText("PRE:" + label.getText());

       return label;

    }
}

// Some time later...

JList list = new JList();
list.setCellRenderer(new ExampleListCellRenderer());

Altri suggerimenti

Credo che i nomi sono prodotte con i metodi toString() di tali oggetti. Se si riesce a cambiare la situazione, che è più facile. In caso contrario, una soluzione rapida sarebbe quella di avvolgere qualche tipo di oggetto titolare intorno ad ogni uno che genera la vista dell'oggetto per il JList e da cui è possibile recuperare l'oggetto contenuto abbastanza facilmente quando si deve manipolare per davvero.

Per espandere il concetto avvolgitore:

class FooBarAgentHolder {
    // Simple javabean stuff
    private FooBarAgent agent;
    public FooBarAgentHolder(FooBarAgent agent) { this.agent = agent; }
    public FooBarAgent getAgent() { return agent; }

    // Produce the name for human consumption
    public String toString() {
        return agent.getDescriptiveName(); // Or whatever...
    }

    // Convenience conversion function
    public static DefaultListModel makeListModel(List<FooBarAgent> list) {
        DefaultListModel result = new DefaultListModel();
        for (FooBarAgent agent: list)
            result.addElement(new FooBarAgentHolder(agent));
        return result;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top