2009-04-13 11 views
6

Jedes Mal, wenn ich einen benutzerdefinierten CellRenderer für eine JList erstelle, reagieren alle Elemente, die ich hinzufüge, niemals auf Aktionen. Wenn der CellRenderer beispielsweise ein JPanel mit Elementen zurückgibt, von denen eines über einen ActionListener verfügt, antwortet es überhaupt nicht.Java Swing - benutzerdefiniertes JList-CellRendering - Erfassen von Aktionen

Warum ist das?

+1

Sehr gute Frage. Ich dachte, es könnte etwas mit ItemListeners zu tun haben, aber jetzt glaube ich nicht ... Ich habe versucht, Beispielcode zu finden, war aber nicht erfolgreich. – Uri

+0

Hallo, ich habe das gleiche Problem, können Sie das Problem lösen? – user236501

Antwort

6

Das Element, das Sie als Listenzellen-Renderer zurückgeben, ist für genau das gedacht: Rendering. Registrieren Sie Listener mit der JList (im Allgemeinen benötigen Sie einen ListSelectionListener).

11

Der Renderer wie eine Fabrik aussehen kann Komponenten für die Zellen für die Rückgabe, sondern neu zu konfigurieren in der Tat ist es folgt das Fliegengewicht Rendering Ansatz und verwendet die gleiche Komponente für die Darstellung aller Zellen (jeder Anruf zu getListCellRendererComponent() soll dieselbe Komponenteninstanz für eine bestimmte Zelle und gibt sie zurück, so dass die Zelle gerendert werden kann).

Auf diese Weise können Sie JList (sowie JTable und JTree) zeigen enorme Menge an Zellen ohne Komponenten für jede Zelle instanziieren ist. Als Nebeneffekt kann die Renderkomponente nicht auf Ereignisse reagieren, da sie nur während der Renderschleife verwendet wird, aber nicht in der Komponentenstruktur angezeigt wird.

Wie Neil Coffey sagte: Sie Ihre Zuhörer zum JList (JTable, JTree) statt hinzufügen können, und die Helfer Methoden (locationToIndex(...), getCellBounds(...)), die Zelle versenden beeinflusst wurde und somit mit zellspezifischen Logik beschäftigen.

+1

+1 für eine anständige Erklärung – basszero

+1

Denken Sie an die gerenderte Komponente als ein Stempel. –