我很难用JTable
数据刷新。
我正在实现我自己的TableModel
,从javax.swing.table.AbstractTableModel
延伸,使用一个接收java.util.ArrayList<>
的方法并处理它以从表数据构建Object[][]
正在阅读。
逻辑如下:
我正在使用一些记录键实现一个JList,当用户选择一个时,会触发一个方法来获取密钥并查询MySQL数据库以获取与该密钥相关的记录。最终结果是ArrayList&lt;&gt;我传递给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&lt;&gt;:
开头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刷新问题。
非常感谢任何帮助。
答案 0 :(得分:1)
我发现了这个问题,正如我所想,这是一个GUI问题,不是刷新,而是滥用布局包:)
正如我所说,我正在使用DesignGridLayout
,它的好处是可以创建一组名为RowGroup
的行,并根据GUI的便利/需要隐藏它或显示它。
我将表放在RowGroup
中并在数据库上有结果时调用show()
方法,并且表中加载了这些结果,从而显示它;我没有找到任何结果时调用了hide()
方法,因此表格将为空,所以我将其隐藏起来。
关键是调用hide()
方法是累积的...如果我调用方法3次,我需要调用show()方法3次以显示它,所以,如果我在JList
中选择了连续3行,表中有空结果集,我将调用hide()
方法3次,所以当我选择确实有表格结果的行时,我会只调用一次show()
方法,因此在3次尝试选择包含表格结果的行之前,表格从未按预期显示。
我已经设置了一个控制字段,迫使应用只调用hide()
方法一次,因为遗憾的是,DesignGridLayout
包不包含isHide()
方法来测试{是否{ {1}}已被调用。
非常感谢您的支持。我的神秘问题现在已经解决了。