C'est ma 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;
}
J'appellerai cette méthode pour récupérer les données de la base de données et les mettre dans un modèle de table
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);
}
Actuellement, j'utilisais cette méthode pour actualiser la table après avoir mis à jour les données de la table. Je vais d'abord débarrasser la table
DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
tableModel.setRowCount(0);
puis restructurez à nouveau le modèle de table pour qu'il actualise le jTable. Mais je pensais qu'il y avait des meilleures pratiques ou une meilleure façon de le faire?
DefaultTableModel.addRow
devrait déjà gérer ça ... Votre table n'est-elle pas rafraîchie paraddRow
?setValueAt
,DefaultTableModel
déclenche l'événement.javax.swing.table.AbstractTableModel
, car l'interfaceTableModel
n'a pas la méthode mentionnée ci-dessusLe moyen le plus rapide pour votre cas est:
jTable.repaint(); // Repaint all the component (all Cells).
La manière optimisée quand une ou plusieurs cellules changent:
((AbstractTableModel) jTable.getModel()).fireTableCellUpdated(x, 0); // Repaint one cell.
la source
essaye ça
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(); /**/ }
la source
DefaultTableModel dm = (DefaultTableModel)table.getModel(); dm.fireTableDataChanged(); // notifies the JTable that the model has changed
la source
Ne serait-il pas préférable de l'utiliser
java.util.Observable
etjava.util.Observer
cela entraînera une mise à jour du tableau?la source
Je l'ai fait comme ça dans ma Jtable, son autorefreshing après 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 }); }}
Je doute que cela fasse du bien avec un grand nombre d'objets comme plus de 500, le seul autre moyen est d'implémenter TableModelListener dans votre classe, mais je n'ai pas compris comment bien l'utiliser. regardez http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange
la source