我很难JTable
刷新数据。
我正在实现我自己的TableModel
,从 扩展javax.swing.table.AbstractTableModel
,使用接收java.util.ArrayList<>
并处理它以构建Object[][]
读取表数据的方法。
逻辑如下:
我正在实现一个带有一些记录键的 JList,当用户选择一个时,会触发一个方法来获取键并查询 MySQL 数据库以获取与该键相关的记录。最终结果是一个 ArrayList<>,我将它传递给 TableModel 以构造数据,然后将其设置到我的表中。
它可以正常工作,但是在几次点击后,它会停止显示表格数据,过了一会儿,它又开始工作了。我不确定刷新表格或整个 GUI 是否有问题。
这是代码的摘录:
建表数据的方法:
public void createTableData(java.util.ArrayList<Lote> alLote) {
//Lote is an entity class modeling the database table.
TABLE_DATA = new Object[alLote.size()][TABLE_COLUMNS.length];
//TABLE_DATA is an Object array, TABLE_COLUMNS is a String[] containing the names of the columns.
int i = 0;
for (Lote element : alLote) {
int j = 0;
TABLE_DATA[i][j++] = element.getFirstColumnValue();
//and so son
i++;
}
super.fireTableDataChanged();
}
启动 GUI 时,它以一个空的 ArrayList<> 开始:
LoteTableModel ltm = new LoteTableModel();
arrayList = new ArrayList<Lote>();
ltm.createTableData(arrayList);
myTable = new JTable();
myTable.setModel(ltm);
scrollPane = new JScrollPane(myTable);
我正在使用 DesignGridLayout btw,当表没有记录时隐藏并在有结果时显示的 RowGroup,以及作为表容器的 JScrollPane。
dgl = new DesignGridLayout(panel);
dgl.row().center().group(group).add(scrollPaneContainingTable).fill();
centerPanel.add(panel, BorderLayout.CENTER);
getContentPane().add(centerPanel);
centerPanel.setVisible(true);
然后,每次用户从 JList 中选择一个项目时,我都会查询数据库并获取与所选值相关的记录:
public void listSelectionChanged() {
bloque = alBloque.get(listBloque.getSelectedIndex());
//bloque is another entity, alBloque is an ArrayList<Bloque> from which the JList (named listBloque) ListModel is constructed.
try {
//database query here, omitted
if (result.getStatus() == SUCCESS) {
//the query returned a populated ArrayList<Lote>
alLote = result.getArray();
((LoteTableModel) myTable.getModel()).createTableData(alLote);
myTable.revalidate();
}
} catch (Exception e) {}
}
正如我之前所说,它可以正常工作几次,单击列表上的值会在表格中显示它们的相关记录,但是在单击几个之后,它根本停止显示数据。稍等片刻,然后再次单击某个值,将再次显示正确的数据,所以正如我之前所说,我不确定是否更像是一个 GUI 刷新问题。
任何帮助将不胜感激。