2013-02-17 17 views
6

Wie kann ich eine Komponente von einem JList abrufen, mit der Klickposition?Holen Sie sich eine Komponente von JList nach Klickposition

Ich habe meine eigene Liste Cell Renderer, wo ich einige Panels und Etiketten einfügen. Jetzt möchte ich z.B. das Etikett, auf das der Benutzer geklickt hat.

Ich versuchte die Methode list.getComponentAt(evt.getPoint());, aber es gibt nur die gesamte JList zurück.

+0

Für eine 'JList', eine [' ListSelectionListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionListener.html) hinzuzufügen. Um schneller Hilfe zu bekommen, schreiben Sie eine [SSCCE] (http://sscce.org/). –

+3

Die 'JList' enthält keine Komponenten. Es verwendet den 'ListCellRenderer', um einen" Stempel "der Komponente auf die Liste zu malen. Das heißt, jedes Element in der Liste wird gerendert unter Verwendung des gleichen/einzigen 'ListCellRenderer' – MadProgrammer

Antwort

17

ich nicht getestet habe, aber die Grundlagen wären ...

  1. Verwenden JList#locationToIndex(Point) den Index des Elements bei der gegebenen Punkt zu bekommen.
  2. Holen Sie das "Element" auf den angegebenen Index (mit JList#getModel#getElementAt(int)).
  3. Holen Sie sich die ListCellRenderer mit JList#getCellRenderer.
  4. das Element übertragen und es ist Component Darstellung
  5. der Renderer der Grenzen zu den gewünschten Zellgrenzen
  6. Konvertieren in das Kontext Component s
  7. Verwenden getComponentAt auf den Renderer Set erhalten die ursprüngliche Point ...

Möglicherweise etwas wie ...

int index = list.locationToIndex(p); 
Object value = list.getModel().getElementAt(int); 
Component comp = listCellRenderer.getListCellRendererComponent(list, value, index, true, true); 
comp.setBounds(list.getCellBounds(index, index)); 
Point contextPoint = SwingUtilities.convertPoint(list, p, comp); 
Component child = comp.getComponentAt(contextPoint); 
2

MadProgrammer funktioniert gut, solange der Benutzer nicht außerhalb einer Zelle klickt. Wenn er das tut, wird der von locationToIndex() zurückgegebene Index die Zelle des letzten Index sein, so dass der konvertierte Punkt unter der gerenderten Komponente liegt.

Um zu überprüfen, ob der Benutzer wirklich auf eine Zelle geklickt hat:

int index = list.locationToIndex(p); 
if (index > -1 && list.getCellBounds(index, index).contains(p)){ 
    // rest of MadProgrammer solution 
    ... 
} 
+0

Dies löste das Problem, das ich hatte, wenn ich immer unter die Listenelemente klickte, bekam es immer die letzte Komponente. – TraderJosh