Java Swing - prestação de célula personalizado JList - ações de captura
-
09-09-2019 - |
Pergunta
Toda vez que eu faço um renderizador de célula personalizado para uma JList, quaisquer elementos que eu adicionar a ele não sempre responder às ações. Por exemplo, se eu tiver o renderizador de célula retornar um JPanel com elementos nela, um dos quais tem um ActionListener, ele não responder a todos.
Por que isso?
Solução
O item que você retornar como um renderizador de célula lista destina-se exatamente isso: renderização . Registrar ouvintes com a JList (geralmente, você vai querer um ListSelectionListener).
Outras dicas
O processador pode ser parecido com uma fábrica para o regresso de componentes para as células, mas na verdade ele segue o flyweight renderização abordagem e usa o mesma componente para renderizar todas as células (cada chamada para getListCellRendererComponent()
é suposto reconfigure a mesma instância do componente para uma célula específica e devolvê-lo de modo que a célula pode ser processado).
Dessa forma, você pode ter JList
(bem como JTable
e JTree
) exibir enorme quantidade de células sem ter que componentes instanciar para cada célula. Como efeito colateral, a lata componente não responder a eventos render, uma vez que só é usado durante o ciclo render, mas não aparece na árvore de componentes.
Assim como Neil Coffey disse, você pode adicionar os seus ouvintes ao JList
(JTable
, JTree
) em vez, e usar os métodos auxiliares (locationToIndex(...)
, getCellBounds(...)
) para expedição que celular foi afetada e, portanto, lidar com lógica específica celular.