Para hacer que una columna sea editable, debe anular el método isCellEditable
en el TableModel
. Crear un TableModel
es bastante fácil si hereda AbstractTableModel
y lo recomendaría para todos menos para el JTable
s más simple.
Sin embargo, adaptar TableModel
es solo una parte de lo que debe hacer. Para obtener un componente personalizado en el JTable
, debe establecer un procesador de celdas personalizado. Para usar un componente personalizado interactivo, debe establecer un editor de celda personalizado. En algunos casos, es suficiente usar versiones ligeramente modificadas de las clases predeterminadas para esto.
Editores
Si ya tiene un componente personalizado que se hace fácilmente mediante delegación: Crear una nueva clase que implementa TableCellEditor
, y devuelven un nueva instancia del componente en el método getCellEditorComponent
. Los parámetros de este método incluyen el valor actual, así como las coordenadas de la celda, un enlace a la tabla y si está seleccionada la celda o no.
El TableCellEditor
también tiene un método que se invoca cuando el usuario comete un cambio en el contenido de la celda (donde puede validar la entrada del usuario y ajustar el modelo) o cancela una edición. Asegúrese de llamar al método stopEditing()
en su editor si alguna vez aborta programáticamente la edición, de lo contrario, el componente del editor permanecerá en la pantalla; esta vez me tomó aproximadamente 2 horas para depurar.
Tenga en cuenta que dentro de un JTable
editores y solo los editores reciben eventos! Mostrar un botón se puede hacer usando un renderizador. Pero para obtener un botón de funcionamiento, debe implementar un editor con el EventListeners
correcto registrado. El registro de un oyente en un procesador no hace nada.
Renderizadores
La implementación de un procesador no es estrictamente necesario para lo que usted describe en su pregunta, pero normalmente terminan haciendo de todos modos, aunque sólo sea por modificaciones menores. Los renderizadores, a diferencia de los editores, son críticos para la velocidad. ¡El getTableCellRendererComponent
de un procesador se llama una vez para cada celda de la tabla! El componente devuelto por un renderizador solo se utiliza para pintar la celda, no para la interacción, y por lo tanto se puede "reutilizar" para la siguiente celda. En otras palabras, debe ajustar el componente (por ejemplo, usando setText(...)
o setFont(...)
si es un TextComponent
) en el procesador, debe no crear una nueva instancia: esa es una manera fácil de paralizar el rendimiento.
Advertencias
Tenga en cuenta que para la extracción de grasas y editores trabajar, es necesario contar la JTable
cuándo utilizar un procesador seguro/editor. Básicamente hay dos formas de hacer esto. Puede configurar el procesador/editor de celdas predeterminado para un tipo determinado utilizando los métodos respectivos JTable
. Para que esto funcione, su TableModel
necesita devolver exactamente este tipo en el método getColumnClass(...)
. El modelo de tabla predeterminado será no haga esto para usted, siempre devuelve Object.class
. Estoy seguro de que ha dejado perplejas a mucha gente.
La otra manera de configurar el editor/procesador es estableciendo explícitamente en la propia columna, es decir, al recibir la TableColumn
a través del método de la JTable
getTableColumn(...)
. Esto es mucho más elaborado, sin embargo, también es la única manera de tener dos renderizadores/editores diferentes para una sola clase. P.ej. su modelo puede tener dos columnas de clase String que se procesan de maneras completamente diferentes, tal vez una vez usando un JLabel/DefaultRenderer
y el otro usando un JButton
para acceder a un editor más elaborado.
JTable
con sus procesadores y editores personalizados es muy versátil, pero también es mucho para tomar, y hay un montón de cosas para hacer el mal. ¡Buena suerte!
How to Use Tables en The Swing Tutorial es una lectura obligatoria para cualquiera que personalice JTables. En particular, lea y vuelva a leer Concepts: Editors and Renderers porque normalmente demora un tiempo en "hacer clic". Los ejemplos en renderizadores y editores personalizados también son muy útiles.
favor reformular la pregunta, por lo que no suena fuera de tema ("Preguntas que nos piden para recomendar o encontrar un libro, herramienta, biblioteca de software, tutoriales u otro recurso fuera de las instalaciones son fuera del tema de Stack Overflow, ya que tienden a atraer respuestas obstinadas y spam. En su lugar, describa el problema y lo que se ha hecho hasta ahora para resolverlo "). –