Tutorial editable de JTable
Pregunta
¿Hay algún buen libro o sitio web que analice la creación de un JTable
?Quiero que una columna sea editable.En realidad me gustaría poner un heredado. JCheckBox
componente (que creamos aquí) en una de las columnas de la tabla en lugar de simplemente colocar la tabla JCheckBox
en base a que es editable boolean
campo.
Tengo Tutorial de swing de JFC Segunda edición libro, pero solo me gustaría saber si hay otros ejemplos que pueda ver y aprender a manejar mejor las tablas.El libro parece simplemente tomar el 'sendero' de Java en línea y ponerlo en el libro.
Sin embargo, estoy releyendo el material, por curiosidad si alguien ha encontrado algo que pueda ayudar más.
Solución
Para hacer que una columna sea editable, debe anular el isCellEditable
método en el TableModel
.Creando un TableModel
es bastante fácil si heredas AbstractTableModel
y lo recomendaría para todos menos para los más simples. JTable
s.
Sin embargo, adaptar el TableModel
es sólo una parte de lo que necesitas hacer.Para obtener realmente un componente personalizado en el JTable
, debe configurar un procesador de celdas personalizado.Para utilizar un componente personalizado interactivo, debe configurar un editor de celda personalizado.En algunos casos, basta con utilizar versiones ligeramente modificadas de las clases predeterminadas para ello.
Editores
Si ya tiene un componente personalizado, puede hacerlo fácilmente usando la delegación:Crear una nueva clase implementando TableCellEditor
, y devolver un nuevo instancia del componente en el getCellEditorComponent
método.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 la celda está seleccionada o no.
El TableCellEditor
también tiene un método que se llama cuando el usuario confirma 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 stopEditing()
método en su editor si alguna vez cancela la edición mediante programación; de lo contrario, el componente del editor permanecerá en la pantalla; esto una vez me tomó como 2 horas depurar.
Tenga en cuenta que dentro de un JTable
editores y solo ¡los editores reciben eventos!La visualización de un botón se puede realizar mediante un renderizador.Pero para que un botón funcione, es necesario implementar un editor con el botón correcto. EventListeners
registrado.Registrar un oyente en un renderizador no hace nada.
Renderizadores
Implementar un renderizador no es estrictamente necesario para lo que describe en su pregunta, pero normalmente termina haciéndolo de todos modos, aunque solo sea para modificaciones menores.Los renderizadores, a diferencia de los editores, son críticos en cuanto a velocidad. El getTableCellRendererComponent
de un renderizador se llama una vez por cada celda de la tabla. El componente devuelto por un renderizador solo se usa para pintar la celda, no para interactuar y, por lo tanto, puede "reutilizarse" para la siguiente celda.En otras palabras, debes ajustar el componente (p. ej.usando setText(...)
o setFont(...)
si es un TextComponent
) en el renderizador, deberías no crear una instancia nueva: esa es una manera fácil de perjudicar el rendimiento.
Advertencias
Tenga en cuenta que para que los renderizadores y editores funcionen, debe indicarle al JTable
cuándo utilizar un determinado renderizador/editor.Básicamente hay dos maneras de hacer esto.Puede configurar el procesador/editor de celda predeterminado para un cierto tipo usando el respectivo JTable
métodos.Para que esta forma funcione, su TableModel
necesita devolver exactamente este tipo en el getColumnClass(...)
¡método!El modelo de tabla predeterminado no haz esto por ti, siempre regresa Object.class
.Estoy seguro de que eso ha dejado perplejos a mucha gente.
La otra forma de configurar el editor/renderizador es configurándolo explícitamente en la propia columna, es decir, obteniendo el TableColumn
mediante el getTableColumn(...)
método de la JTable
.Esto es mucho más elaborado, sin embargo, también es la única forma de tener dos renderizadores/editores diferentes para una sola clase.P.ej.su modelo puede tener dos columnas de clase String que se representan 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 renderizadores y editores personalizados es extremadamente versátil, pero también hay mucho que asimilar y hay muchas cosas que hacer mal.¡Buena suerte!
Cómo utilizar tablas en El tutorial de swing Es una lectura obligatoria para cualquiera que personalice JTables.En particular, lea y relea Conceptos:Editores y renderizadores porque normalmente tarda un poco en hacer "clic".Los ejemplos sobre renderizadores y editores personalizados también son muy valiosos.
Otros consejos
La clase que desea ampliar para crear su propio comportamiento es DefaultTableModel.Eso te permitirá definir tu propio comportamiento.Se puede encontrar un tutorial decente. en el sitio del sol.
Este tutorial de la vestíbulo de java es fácil de seguir.el en linea Sendero de swing para JTable al que hace referencia indica que ha sido actualizado.¿Examinó todo el asunto en busca de información posible y mejor (no es siempre mejor la información más nueva)?
Si estás intentando utilizar un simple JTable
con 1 columna editable y conoce la ubicación de la columna, siempre puede usar el modelo de tabla predeterminado y sobrecargar el isCellEditable
llamar.
algo como esto :
myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
if (column == x) {
return true;
} else
return false;
}
});
Y para la casilla de verificación, cree una clase de renderizador.
MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer
Algunas clases útiles son:
Package javax.swing.table
:
TableModel
- Interfaz para un tablemodel
AbstractTableModel
- Buena clase para ampliar y crear tu propia tabla con estructuras de datos personalizadas.DefaultTableModel
- Modelo de tabla predeterminado que puede tratar arrays[]
y Vectors
Para deshabilitar la edición en cualquier celda, debe anular el isCellEditable(int row, int col)
método
en su modelo de tabla, debe anular las funciones "isCellEditable" y "setValueAt", como se muestra a continuación.
La columna 4 es la columna de celdas editables.
Luego, cuando haces doble clic en la celda y escribes algo,
Se llamará a setValueAt() y se guardará el valor en el DO del tableModel, campo col4.
public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table
@Override
public boolean isCellEditable(int row, int col) {
if (col == 4) {
return true;
} else {
return false;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
if (col == 4) {
tbmData.get(row).col4= (String) value;
}
fireTableCellUpdated(row, col);
} else {
}
}