1

我很难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 刷新问题。

任何帮助将不胜感激。

4

1 回答 1

1

我发现了这个问题,正如我所想,这是一个 GUI 问题,不是刷新,而是滥用 Layout 包:)

正如我所说,我正在使用DesignGridLayout,它具有创建一组行的好处,RowGroup根据 GUI 的便利性/需要调用并隐藏它或显示它。

我将表放在a中,当数据库中有结果时RowGroup调用该方法,表中加载了这些结果,从而显示它;show()hide()在没有找到结果时调用了该方法,因此表将为空,因此我将其隐藏。

关键是调用该hide()方法是累积的......如果我调用该方法 3 次,我也需要调用 show() 方法 3 次才能显示它,所以,如果我在我JList的 with中选择 3 个连续行表的空结果集,我将调用该hide()方法 3 次,因此当我选择确实有表结果的行时,我将只调用该show()方法一次,因此该表在 3 次尝试之前永远不会按预期显示为表选择带有结果的行。

我已经放置了一个控制字段,它强制应用程序只调用hide()一次该方法,因为遗憾的是,该DesignGridLayout包不包含isHide()测试是否hide()已被调用的方法。

非常感谢您的支持。我的神秘问题现在解决了。

于 2013-03-06T16:26:42.937 回答