2008-09-17 152 views
11

¿Hay algún buen libro o sitio web que vaya a crear un JTable? Quiero hacer una columna editable. Me gustaría poner realmente un componente JCheckBox heredado (que hemos creado aquí) en una de las columnas de la tabla en lugar de simplemente poner la tabla JCheckBox en función de que se trata de un campo boolean editable.Editable JTable Tutorial

Tengo el libro JFC Swing Tutorial Second Edition pero me gustaría saber si hay otros ejemplos que pueda ver y aprender a manejar mejor las tablas. El libro parece tomar el "rastro" de Java en línea y ponerlo en el libro.

Sin embargo, estoy volviendo a leer las cosas, solo curiosidad por si alguien ha encontrado algo que podría ayudarme más.

+0

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 "). –

Respuesta

31

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 JTablegetTableColumn(...). 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.

+0

wow , mucha información, gracias –

+0

Un par de años tarde, pero una gran respuesta. ¡Gracias! – imiric

1

La clase que desea analizar para crear su propio comportamiento es DefaultTableModel. Eso te permitirá definir tu propio comportamiento. Un tutorial decente se puede encontrar on sun's site.

+0

sí, ese es el camino que estoy buscando :) Hemos ampliado AbstractTableModel aquí antes y sé que tengo que anular getColumnClass y isCellEditable y todo eso, estoy teniendo problemas para entender todo esto en las celdas editables :( –

1

Este tutorial del java lobby es fácil de seguir. El Swing trail for JTable en línea al que hace referencia indica que se ha actualizado. ¿Analizó todo el asunto para una mejor información posible (no siempre es mejor)?

0

Algunas clases útiles son:

Package javax.swing.table:

TableModel - Interfaz para un tablemodel AbstractTableModel - Niza clase se amplíe para crear su propia mesa con estructuras de datos personalizados DefaultTableModel - modelo de tabla por defecto que puede tratar con arrays[] y Vectors

Para desactivar la edición en cualquier celda, debe anular el isCellEditable(int row, int col) mí thod

1

Si usted está tratando de utilizar un simple JTable con 1 columna editable y conoce la ubicación de la columna siempre se puede utilizar el modelo de tabla por defecto y la sobrecarga de la llamada isCellEditable.

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 crear una clase de procesador de

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer 
0

en su modelo de tabla, debe reemplazar y funciones "isCellEditable" "setValueAt", como a continuación .
La columna 4 es la columna para celdas editables.
Luego, al hacer doble clic en la celda y escribir algo, se llamará a
setValueAt() y guardará el valor en el DO del modelo de tabla, 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 { 
    } 
}