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.

¿Fue útil?

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. JTables.

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 {
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top