2009-04-13 7 views
6

Za każdym razem, gdy tworzony jest niestandardowy mechanizm renderowania komórki dla pliku JList, elementy dodane do niego nigdy nie reagują na działania. Na przykład: Jeśli renderer komórki zwróci JPanel z elementami na nim, z których jeden ma ActionListener, to w ogóle nie odpowiada.Java Swing - renderowanie komórek niestandardowych JList - przechwytywanie akcji

Dlaczego tak jest?

+1

Bardzo dobre pytanie. Myślałem, że może to mieć coś wspólnego z ItemListeners, ale teraz nie sądzę ... Próbowałem znaleźć przykładowy kod, ale nie udało mu się. – Uri

+0

Witam, stoję wobec tego samego problemu, czy jesteś w stanie rozwiązać problem? – user236501

Odpowiedz

6

Element zwracany jako renderer komórki listy jest przeznaczony do dokładnie tego: renderowania. Zarejestruj listę słuchaczy za pomocą JList (zazwyczaj będziesz potrzebować ListSelectionListener).

11

renderujący może wyglądać fabryki powrocie komponentów do komórek, ale w rzeczywistości wynika z muszej renderingu podejścia i wykorzystuje tę samą składnik ten do renderowania wszystkich komórek (każde wywołanie getListCellRendererComponent() ma przekonfigurować to samo wystąpienie komponentu dla konkretnej komórki i zwróć ją, aby umożliwić renderowanie komórki).

W ten sposób można uzyskać JList (jak również JTable i JTree) wyświetlać ogromną ilość komórek bez konieczności wprowadzania składników dla każdej komórki. Jako efekt uboczny komponent renderowania nie może reagować na zdarzenia, ponieważ jest używany tylko w pętli renderowania, ale nie pojawia się w drzewie komponentów.

Tak jak powiedział Neil Coffey, można dodać słuchaczy do JList (JTable, JTree) zamiast, i korzystać z metod pomocniczych (locationToIndex(...), getCellBounds(...)) wysyłkę, która komórka została dotknięta, a więc do czynienia ze specyficzną logikę komórkowej.

+1

+1 za przyzwoite wytłumaczenie – basszero

+1

Pomyśl o renderowanym komponencie jako pieczątce. –