我在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刷新问题。
我发现了这个问题,正如我所想的,这是一个GUI问题,不是刷新,而是误用布局包:)
正如我所说的,我使用DesignGridLayout
,它的好处是创建一组行,称为RowGroup
,并根据GUI的方便/需要隐藏或显示它。
我将表放在RowGroup
中,当数据库上有结果时调用show()
方法,表被加载这些结果,从而显示它;当没有找到结果时,我调用hide()
方法,因此,表将为空,因此我隐藏了它。
关键是调用hide()
方法是累积的…如果我打电话给方法3次,我需要调用显示()方法3次也为了显示它,所以,如果我选择连续3行JList
空结果集表,我将调用hide()
方法3次,所以当我选择一个表行,确实有结果,我将调用show()
方法只有一次,所以表从来没有像预期的那样显示,直到3尝试选择与结果表行。
我已经放了一个控制字段,强制应用程序调用hide()
方法只一次,因为遗憾的是,DesignGridLayout
包不包括isHide()
方法来测试hide()
是否已被调用。