Java Swing - JList individuelle Zelle Rendering - Erfassung Aktionen
-
09-09-2019 - |
Frage
Jedes Mal, wenn ich eine benutzerdefinierte Zelle Renderer für eine JList machen, werden alle Elemente, die ich ihm hinzufügen reagieren nicht immer zu Aktionen. Wenn ich die CellRenderers zurückgeben JPanel mit Elementen auf es zum Beispiel habe, von denen eine Action hat, ist es überhaupt nicht reagieren.
Warum ist das?
Lösung
Das Element, das Sie als eine Liste CellRenderers zurückkehren wird genau bestimmt, dass: Rendering . Registrieren Zuhörer mit dem JList (in der Regel, werden Sie eine ListSelectionListener wollen).
Andere Tipps
Der Renderer wie eine Fabrik aussehen kann Komponenten für die Zellen für die Rückkehr, aber in der Tat folgt dem Fliegengewicht Rendering Ansatz und verwendet die gleiche Komponente für alle Zellen Rendering (jeder Anruf getListCellRendererComponent()
sollte die gleiche Komponenteninstanz für eine bestimmte Zelle neu zu konfigurieren und senden sie es so, dass die Zelle wiedergegeben werden).
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 Wiedergabekomponente nicht auf Ereignisse reagieren, wie es nur während der Render-Schleife verwendet wird, aber im Komponentenbaum nicht angezeigt wird.
Wie Neil Coffey sagte: Sie Ihre Zuhörer zum JList
hinzufügen (JTable
, JTree
) statt, und verwenden Sie die Hilfsmethoden (locationToIndex(...)
, getCellBounds(...)
) zu versenden, welche Zelle beeinflusst wurde und somit mit zellspezifischen Logik befassen.