To jest mój 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;
}
Wywołam tę metodę, aby pobrać dane z bazy danych i umieścić je w modelu tabeli
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);
}
Obecnie używałem tej metody do odświeżania tabeli po zaktualizowaniu danych tabeli. Najpierw posprzątam ze stołu
DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
tableModel.setRowCount(0);
a następnie ponownie zrestrukturyzuj model tabeli, aby odświeżył jTable. Ale zastanawiałem się, czy są jakieś najlepsze praktyki lub lepszy sposób, aby to zrobić?
DefaultTableModel.addRow
powinna już obsłużyć to ... Czy Twój stół nie jest odświeżany przezaddRow
?setValueAt
,DefaultTableModel
odpala wydarzenie.javax.swing.table.AbstractTableModel
, ponieważ interfejsTableModel
nie obsługuje wyżej wymienionej metodySzybszy sposób na rozwiązanie sprawy to:
jTable.repaint(); // Repaint all the component (all Cells).
Zoptymalizowany sposób w przypadku zmiany jednej lub kilku komórek:
((AbstractTableModel) jTable.getModel()).fireTableCellUpdated(x, 0); // Repaint one cell.
źródło
Spróbuj tego
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(); /**/ }
źródło
DefaultTableModel dm = (DefaultTableModel)table.getModel(); dm.fireTableDataChanged(); // notifies the JTable that the model has changed
źródło
Czy nie byłoby lepiej w użyciu
java.util.Observable
ijava.util.Observer
to spowodowałoby aktualizację tabeli?źródło
Zrobiłem to w ten sposób w moim Jtable, jego automatyczne odświeżanie po 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 }); }}
Wątpię, aby poradził sobie z dużą liczbą obiektów, takich jak ponad 500, innym sposobem jest zaimplementowanie TableModelListener w twojej klasie, ale nie rozumiałem, jak dobrze go używać. spójrz na http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange
źródło