2009-04-13 35 views
6

Cada vez que hago un procesador de celdas personalizado para una JList, cualquier elemento que agregue a él nunca responde a las acciones. Por ejemplo, si el renderizador de la celda devuelve un JPanel con elementos, uno de los cuales tiene un ActionListener, no responde en absoluto.Java Swing - JList procesamiento de celdas personalizado - acciones de captura

¿Por qué es esto?

+1

Muy buena pregunta. Pensé que podría tener algo que ver con ItemListeners, pero ahora no lo creo ... Intenté encontrar un código de muestra pero no tuve éxito. – Uri

+0

Hola, estoy enfrentando el mismo problema, ¿eres capaz de resolver el problema? – user236501

Respuesta

6

El elemento que devuelve como un renderizador de celda de lista está destinado exactamente a eso: representando. Registre oyentes con JList (generalmente, querrá un ListSelectionListener).

11

El procesador puede verse como una fábrica para el retorno de los componentes de las células, pero en realidad sigue el peso mosca representación enfoque y utiliza el mismo componente para la prestación de todas las células (cada llamada a getListCellRendererComponent() se supone que volver a configurar la misma instancia de componente para una celda específica y devolverla para que se pueda procesar la celda).

De esta manera, puede tener JList (así como JTable y JTree) mostrar la cantidad masiva de celdas sin tener que instanciar los componentes para cada celda. Como efecto secundario, el componente de representación no puede responder a eventos, ya que solo se usa durante el ciclo de representación, pero no aparece en el árbol de componentes.

tal como dijo Neil Coffey, se puede añadir sus oyentes a la JList (JTable, JTree) en su lugar, y el uso de los métodos de ayuda (locationToIndex(...), getCellBounds(...)) para despachar el que las células se vio afectada y así hacer frente a la lógica específica de la célula.

+1

+1 para una explicación decente – basszero

+1

Piense en el componente renderizado como un sello de goma. –