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 la tabla jTable. Pero estaba pensando, ¿existen mejores prácticas o una mejor manera de hacerlo?
DefaultTableModel.addRow
ya debería manejar eso ... ¿No es tu tabla actualizada poraddRow
?setValueAt
,DefaultTableModel
dispara el evento.javax.swing.table.AbstractTableModel
, ya que la interfazTableModel
no tiene el método mencionado anteriormenteLa 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.
fuente
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(); /**/ }
fuente
DefaultTableModel dm = (DefaultTableModel)table.getModel(); dm.fireTableDataChanged(); // notifies the JTable that the model has changed
fuente
¿No sería mejor usarlo
java.util.Observable
yjava.util.Observer
eso hará que la tabla se actualice?fuente
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 forma es implementar TableModelListener en su clase, pero no entendí cómo usarlo bien. mira http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange
fuente