2010-12-23 16 views

Antwort

10

Wenn die Informationen, die Sie (anstelle von was auch immer toString() ausspuckt) enthalten ist in dem Objekt selbst, die direkteste „Swing“ Art und Weise sehen mögen, dies zu erreichen ist durch die Verwendung eines ListCellRenderer. Stellen Sie sich einen ListCellRenderer (eigentlich einen CellRenderer) als einen Stempel vor, mit dem jedes Objekt in Ihrer Liste gezeichnet wird. Das Objekt wird übergeben, Sie richten die Komponente ein, die Komponente zeichnet Ihr Objekt und fährt dann mit dem nächsten Objekt fort. Der CellRenderer hat niemals einen Status.

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()); 
+0

basszero danke für deine ausführliche und informative Erklärung von ListcellRenderers und dem von dir bereitgestellten Beispiel. Ich habe viel gelernt :) – blackace

+0

@blackace - Aktivieren Sie das Kontrollkästchen neben der Antwort, um es zu akzeptieren und @Basszero die Punkte zu geben, die er verdient. – I82Much

+0

@ i82Möchten beide Antworten, die ich erhalten habe, korrekt sind. Ich kann das in keiner Weise angeben? – blackace

4

Ich denke, dass die Namen von den toString() Methoden dieser Objekte erzeugt werden. Wenn Sie das ändern können, ist das am einfachsten. Andernfalls wäre es eine schnelle Lösung, eine Art Halterobjekt um jeden zu wickeln, der die Ansicht des Objekts für die JList generiert und aus dem Sie das enthaltene Objekt leicht abrufen können, wenn Sie es für die reale Bearbeitung manipulieren müssen.

auf dem Wrapper-Konzept zu 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; 
    } 
} 
+0

Vielen Dank für Ihre schnelle Antwort. Ich möchte den ursprünglichen Objektnamen nicht ändern, daher denke ich, dass diese Option nicht in Frage kommt, es sei denn, es gibt einige Tricks, die mir nicht bekannt sind. Auf deinen zweiten Vorschlag. Könnten Sie das bitte erweitern? Ich bin völlig naiv. ein Beispiel wäre sehr hilfreich ... – blackace

+0

@blackace: Versuchen Sie das. Es sollte einfach genug Code sein, dass Sie sehen können, dass es offensichtlich korrekt ist. Passen Sie es an Ihren tatsächlichen Code an (z. B. ändern Sie 'FooBarAgent' und tun Sie das Richtige in' toString'). –

+0

Vielen Dank! jetzt ist es kristallklar :-) – blackace