JTable刷新问题



我在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()是否已被调用。

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

相关内容

  • 没有找到相关文章

最新更新