JTable Cómo actualizar el modelo de tabla después de insertar, eliminar o actualizar los datos.

4 minutos de lectura

JTable Como actualizar el modelo de tabla despues de insertar
usuario236501

Esta es mi jTable

private JTable getJTable() {
    String[] colName = { "Name", "Email", "Contact No. 1", "Contact No. 2",
            "Group", "" };
    if (jTable == null) {
        jTable = new JTable() {
            public boolean isCellEditable(int nRow, int nCol) {
                return false;
            }
        };
    }
    DefaultTableModel contactTableModel = (DefaultTableModel) jTable
            .getModel();
    contactTableModel.setColumnIdentifiers(colName);
    jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    return jTable;
}

Llamaré a este método para recuperar los datos de la base de datos y ponerlos en el modelo de tabla.

public void setUpTableData() {
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
    ArrayList<Contact> list = new ArrayList<Contact>();
    if (!con.equals(""))
        list = sql.getContactListsByGroup(con);
    else
        list = sql.getContactLists();
    for (int i = 0; i < list.size(); i++) {
        String[] data = new String[7];

            data[0] = list.get(i).getName();
            data[1] = list.get(i).getEmail();
            data[2] = list.get(i).getPhone1();
            data[3] = list.get(i).getPhone2();
            data[4] = list.get(i).getGroup();
            data[5] = list.get(i).getId();

        tableModel.addRow(data);
    }
    jTable.setModel(tableModel);
}

Actualmente estaba usando este método para actualizar la tabla después de actualizar los datos de la tabla. Primero limpiaré la mesa.

DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
tableModel.setRowCount(0);

y luego reestructurar el modelo de tabla nuevamente para que actualice jTable. Pero estaba pensando, ¿hay mejores prácticas o una mejor manera de hacerlo?

1644183365 900 JTable Como actualizar el modelo de tabla despues de insertar
pedro lang

Si quieres avisar a tu JTable sobre cambios de sus datos, uso
tableModel.fireTableDataChanged()

Desde el documentación:

Notifica a todos los oyentes que todos los valores de celda en las filas de la tabla pueden haber cambiado. El número de filas también puede haber cambiado y JTable debería volver a dibujar la tabla desde cero. Se supone que la estructura de la tabla (como en el orden de las columnas) es la misma.

  • ¿Quiere decir que llamo a este tableModel.fireTableDataChanged() cada vez que actualizo?

    – usuario236501

    05 jul.

  • @ newbie123: si solo inserta nuevas líneas, puede usar fireTableRowsInserted en lugar de. Por otra parte, la implementación de DefaultTableModel.addRow ya debería encargarse de eso… ¿No ha refrescado su mesa addRow?

    – Peter Lang

    05 jul.


  • Usar setValueAt, DefaultTableModel dispara el evento.

    – Peter Lang

    05 jul.

  • Sin embargo, se debe notar que la llamada debe hacerse en yeso. javax.swing.table.AbstractTableModel, desde la interfaz TableModel no tiene el método mencionado anteriormente

    – Milan Aleksić

    17 feb.


JTable Como actualizar el modelo de tabla despues de insertar
daniel de leon

La forma más rápida para su caso es:

    jTable.repaint(); // Repaint all the component (all Cells).

La forma optimizada cuando una o pocas celdas cambian:

    ((AbstractTableModel) jTable.getModel()).fireTableCellUpdated(x, 0); // Repaint one cell.

  • De hecho, descubrí que jTable.invalidate() era el método que realmente forzaba un redibujado.

    –Kevin Qiu

    06 jun.

  • Correcto, pero el método de validación es parte del proceso de diseño y también afecta a los padres del contenedor. Entonces, si necesita rehacer el diseño, úselo. docs.oracle.com/javase/7/docs/api/java/awt/…

    –Daniel De León

    07 jun.

1644183366 654 JTable Como actualizar el modelo de tabla despues de insertar
Aquiles

prueba esto

public void setUpTableData() {
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();

    /**
    * additional code.
    **/
    tableModel.setRowCount(0);
    /**/
    ArrayList<Contact> list = new ArrayList<Contact>();
    if (!con.equals(""))
        list = sql.getContactListsByGroup(con);
    else
        list = sql.getContactLists();
    for (int i = 0; i < list.size(); i++) {
        String[] data = new String[7];

        data[0] = list.get(i).getName();
        data[1] = list.get(i).getEmail();
        data[2] = list.get(i).getPhone1();
        data[3] = list.get(i).getPhone2();
        data[4] = list.get(i).getGroup();
        data[5] = list.get(i).getId();

        tableModel.addRow(data);
    }
    jTable.setModel(tableModel);
    /**
    * additional code.
    **/
    tableModel.fireTableDataChanged();
    /**/
}

  • No necesita jTable.setModel(tableModel) al final, ya que ya obtuvo el modelo de Table al principio.

    – David Jorge

    13 mayo 2014 en 08:18

DefaultTableModel dm = (DefaultTableModel)table.getModel();
dm.fireTableDataChanged(); // notifies the JTable that the model has changed

1644183366 485 JTable Como actualizar el modelo de tabla despues de insertar
Tomás

¿No sería mejor usar java.util.Observable y java.util.Observer eso hará que la tabla se actualice?

  • no, seguro que no, no hagas eso, ¿por qué simulaste la opción integrada de JTable y la sacaste de EDT?

    – mKorbel

    16 oct.

Lo hice así en mi Jtable, se actualiza automáticamente después de 300 ms;

DefaultTableModel tableModel = new DefaultTableModel(){
public boolean isCellEditable(int nRow, int nCol) {
                return false;
            }
};
JTable table = new JTable();

Timer t = new Timer(300, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                addColumns();
                remakeData(set);
                table.setModel(model);
            }
        });
        t.start();

private void addColumns() {
        model.setColumnCount(0);
        model.addColumn("NAME");
            model.addColumn("EMAIL");} 

 private void remakeData(CollectionType< Objects > name) {
    model.setRowCount(0);
    for (CollectionType Objects : name){
    String n = Object.getName();
    String e = Object.getEmail();
    model.insertRow(model.getRowCount(),new Object[] { n,e });
    }}

Dudo que funcione bien con una gran cantidad de objetos como más de 500, la única otra forma es implementar TableModelListener en su clase, pero no entendí cómo usarlo bien. mirar http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

  • no, seguro que no, no hagas eso, ¿por qué simulaste la opción integrada de JTable y la sacaste de EDT?

    – mKorbel

    16 oct.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad