Frage

Ich habe eine JList die DefaultListModel verwendet und ich füllen Sie es mit Objekten ich aus einer Liste (Kontext: die Objekte sind eine Art von Agenten in ABM-System)

.

Ist es möglich, den Namen zu ändern, das ist gezeigt für die Objekte in dem JList? Ich habe nicht in der Lage gewesen, alles auf diese zu finden ...

War es hilfreich?

Lösung

Wenn die Informationen, die Sie sehen wollen, (anstelle von was auch immer toString () ausspuckt) in dem Objekt selbst enthalten ist, die direkteste „Swing“ Art und Weise, dies zu erreichen, ist die Verwendung eines ListCellRenderer . Denken Sie an einem ListCellRenderer (alle Zellrenderer wirklich) als Stempel verwendet, um jedes Objekt in der Liste zu ziehen. Das Objekt wird übergeben, Sie Setup die Komponente, die Komponente Ihr Objekt zieht, und dann bewegt sich auf das nächste Objekt. Die Zellrenderer hat nie einen Staat.

Betrachten Sie dieses Beispiel:

// 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());

Andere Tipps

Ich denke, die Namen von den toString() Methoden dieser Objekte erzeugt werden. Wenn Sie das ändern können, ist das einfachste. Andernfalls wäre eine schnelle Lösung, eine Art von Halter Objekt wickeln um jeden, den die Ansicht des Objekts für den JList und von dem erzeugt können Sie das enthaltene Objekt leicht genug ab, wenn Sie es wirklich zu manipulieren.

auf dem Wrapper-Konzept erweitern:

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