2010-07-05 102 views
79

Esta es mi JTableJTable Cómo actualizar el modelo de tabla después de insertar Eliminar o actualizar los datos.

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; 
} 

Voy a llamar a este método para recuperar los datos de la base de datos y ponerlo en modelo de mesa

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 yo estaba usando este método para actualizar la tabla después de la actualización del datos de la mesa Primero borraré la tabla

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

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

Respuesta

101

Si desea notificar a su JTable sobre los cambios de los datos, utilice
tableModel.fireTableDataChanged()

Desde el documentation:

notifica a todos los oyentes que todos los valores de las celdas en las filas de la tabla pueden haber cambiado. El número de filas también puede haber cambiado y JTable debe volver a dibujar la tabla desde cero. La estructura de la tabla (como en el orden de las columnas) se supone que es la misma.

+0

qué se refiere llamo a esto tableModel.fireTableDataChanged() cada vez que estoy actualizando? – user236501

+3

@ newbie123: Si sólo insertar nuevas líneas, puede utilizar [fireTableRowsInserted] (http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html#fireTableRowsInserted% 28int,% 20int% 29) en su lugar. Por otra parte, la implementación de 'DefaultTableModel.addRow' ya debería manejar eso ... ¿No es su mesa refrescado por' addRow'? –

+0

Estoy usando addRow funciona, pero ¿qué hay de la actualización? – user236501

-2

Lo hice así en mi Jtable es autorefrescante 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 va a hacer bien con gran número de objetos como más de 500, única otra forma es implementar TableModelListener en su clase, pero yo no entendía cómo usarlo bien. mira http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

1

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

+5

no, seguro que no, no hagas eso, por qué simulé la opción incorporada de JTable y salí de EDT – mKorbel

16

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

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

La forma optimizada cuando uno o pocos cambios celular:

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

Encontré esa jTable .invalidate() fue el método que realmente forzó un redibujado. –

+0

Correcto, pero el método de validar es parte del proceso de disposición e impacta también a los padres del contenedor. Entonces, si necesita rehacer el diseño, úselo. http://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#invalidate() –

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

no, no ... DefaultTableModel ha implementado este evento, e implementado correctamente ... – mKorbel

5

probar 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(); 
    /**/ 
} 
+2

No necesita jTable.setModel (tableModel) al final ya que ya tiene el modelo de la tabla al inicio. –

Cuestiones relacionadas