Java JTable刷新问题

Java JTable刷新问题,java,swing,user-interface,jtable,tablemodel,Java,Swing,User Interface,Jtable,Tablemodel,我很难使用JTable数据刷新 我正在实现自己的TableModel,从javax.swing.table.AbstractTableModel扩展而来,使用一个方法接收java.util.ArrayList并对其进行处理以构建一个对象[][],从中读取表数据 逻辑如下: 我用一些记录键实现了一个JList,当用户选择一个记录键时,会触发一个方法,该方法会拾取该键并查询MySQL数据库以获取与该键相关的记录。最后的结果是一个ArrayList,我将其传递给TableModel来构造数据,然后将其

我很难使用
JTable
数据刷新

我正在实现自己的
TableModel
,从
javax.swing.table.AbstractTableModel
扩展而来,使用一个方法接收
java.util.ArrayList
并对其进行处理以构建一个
对象[][]
,从中读取表数据

逻辑如下:

我用一些记录键实现了一个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();
}
然后,每当用户从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) {}
}
public void listSelectionChanged(){
bloque=alBloque.get(listBloque.getSelectedIndex());
//bloque是另一个实体,alBloque是一个ArrayList,JList(名为listBloque)ListModel就是从它构建的。
试一试{
//此处为数据库查询,省略
if(result.getStatus()==成功){
//查询返回一个填充的ArrayList
alLote=result.getArray();
((LoteTableModel)myTable.getModel()).createTableData(alLote);
myTable.revalidate();
}
}捕获(例外e){}
}
如前所述,它可以正常工作几次,单击列表中的值会在表中显示它们的相关记录,但在单击多个值后,它将完全停止显示数据。稍等片刻,然后再次单击某个值,将再次显示正确的数据,因此正如我之前所说的,我不确定这是否更像是一个GUI刷新问题


任何帮助都将不胜感激。

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

如前所述,我使用的是
DesignGridLayout
,它的好处是创建一组行,称为
RowGroup
,并根据GUI的方便性/需要隐藏或显示它

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

关键是调用
hide()
方法是累积的。。。如果我调用了该方法3次,我也需要调用show()方法3次才能显示它,因此,如果我在
JList
中为表选择了3个连续的行,并且结果集为空,那么我将调用
hide()
方法3次,因此当我选择一个确实有结果的行时,我将只调用一次
show()
方法,因此直到3次尝试为表选择带有结果的行时,表才会按预期显示

我放置了一个控制字段,强制应用程序只调用一次
hide()
方法,因为遗憾的是,
DesignGridLayout
包没有包含一个
isHide()
方法来测试是否调用了
hide()


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

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

如前所述,我使用的是
DesignGridLayout
,它的好处是创建一组行,称为
RowGroup
,并根据GUI的方便性/需要隐藏或显示它

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

关键是调用
hide()
方法是累积的。。。如果我调用了该方法3次,我也需要调用show()方法3次才能显示它,因此,如果我在
JList
中为表选择了3个连续的行,并且结果集为空,那么我将调用
hide()
方法3次,因此当我选择一个确实有结果的行时,我将只调用一次
show()
方法,因此直到3次尝试为表选择带有结果的行时,表才会按预期显示

我放置了一个控制字段,强制应用程序只调用一次
hide()
方法,因为遗憾的是,
DesignGridLayout
包没有包含一个
isHide()
方法来测试是否调用了
hide()


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

不要接受异常。我不知道为什么要将ArrayList转换为对象[][],在我看来,您拥有存储在ArrayList中的表模型所需的所有数据。我唯一想到的是,从片段中,确保您在EDT上下文中从内部将表值应用于模型,只需几条注释:a)对于行为良好的模型,永远不需要重新验证,反之亦然:如果重新验证似乎“修复”了更新问题,模型有问题b)您很可能只想在选择更改为最终更改后更新数据一次,以确保检查模型的getValueIsAdjusting属性event@HyperAnthony,谢谢,我已经这么做了:)不要吞下例外。我不知道你的翻译为什么
dgl = new DesignGridLayout(panel);
dgl.row().center().group(group).add(scrollPaneContainingTable).fill();
centerPanel.add(panel, BorderLayout.CENTER);
getContentPane().add(centerPanel);
centerPanel.setVisible(true);
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) {}
}