2013-02-17 10 views
6

Jak mogę pobrać komponent z JList, z lokalizacją kliknięcia?Pobierz komponent z JList, kliknij lokalizację

Mam własny renderer komórek listy, w którym wstawiam panele i etykiety. Teraz chcę dostać np. etykieta, na którą kliknął użytkownik.

Próbowałem metody list.getComponentAt(evt.getPoint());, ale zwraca tylko cały JList.

+0

po 'JList' dodaj [' ListSelectionListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionListener.html). Aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). –

+3

'JList' nie zawiera żadnych składników. Używa 'ListCellRenderer' do namalowania" pieczątki "komponentu na liście. Oznacza to, że każdy element na liście jest renderowany za pomocą tego samego/pojedynczego 'ListCellRenderer' – MadProgrammer

Odpowiedz

17

Nie testowałem tego, ale podstawy byłoby ...

  1. Zastosowanie JList#locationToIndex(Point) aby uzyskać indeks elementu w danym punkcie.
  2. Pobierz "element" o określonym indeksie (używając JList#getModel#getElementAt(int)).
  3. Uzyskaj ListCellRenderer przy użyciu JList#getCellRenderer.
  4. Render element i uzyskać to Component reprezentacja
  5. Ustaw granic renderujący do wymaganych granicach komórkowych
  6. Konwersja oryginalny Point do Component s kontekście
  7. Korzystanie getComponentAt na renderujący ...

Prawdopodobnie coś jak ...

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

Program MadProgrammer działa dobrze, o ile użytkownik nie kliknie poza komórką. Jeśli to zrobi, indeks zwrócony przez locationToIndex() będzie komórką ostatniego indeksu, więc skonwertowany punkt będzie "pod" renderowanym komponentem. Aby sprawdzić, czy użytkownik rzeczywiście kliknął komórkę, musisz:

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

. Rozwiązał to problem, który miałem gdziekolwiek, gdy kliknąłem poniżej elementów listy, zawsze otrzymywał ostatni komponent. – TraderJosh