JTable刷新问题

时间:2013-03-05 06:30:41

标签: java swing user-interface jtable tablemodel

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

正如我所说,我正在使用DesignGridLayout,它的好处是可以创建一组名为RowGroup的行,并根据GUI的便利/需要隐藏它或显示它。

我将表放在RowGroup中并在数据库上有结果时调用show()方法,并且表中加载了这些结果,从而显示它;我没有找到任何结果时调用了hide()方法,因此表格将为空,所以我将其隐藏起来。

关键是调用hide()方法是累积的...如果我调用方法3次,我需要调用show()方法3次以显示它,所以,如果我在JList中选择了连续3行,表中有空结果集,我将调用hide()方法3次,所以当我选择确实有表格结果的行时,我会只调用一次show()方法,因此在3次尝试选择包含表格结果的行之前,表格从未按预期显示。

我已经设置了一个控制字段,迫使应用只调用hide()方法一次,因为遗憾的是,DesignGridLayout包不包含isHide()方法来测试{是否{ {1}}已被调用。

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