我在Java Swing中更新JTable时遇到问题。

我想显示的数据每秒变化几次,我正在寻找一种有效的方法来更新JTable中的数据。

我使用了setModel()方法来更新数据,它可以工作,但是有两个缺点:


如果用户调整标题中表列的大小,那么他将获得大约10个异常(我认为因为该模型不再可用,因为它每秒更改几次)
每当数据(以及TableModel)更改时,调整大小列的长度信息(以Pixel为单位)都会丢失。


对于TableModel,我使用我自己的模型ResultSetTableModel,该模型扩展了AbstractTableModel。
此ResultSetTableModel具有方法setResultSet(ResultSet rs)并覆盖方法getValueAt(x,y) ...

正如我所告诉的,如果我将一个新的ResultSet设置为ResultSetTableModel,然后通过setModel(resultSetTableModel)方法将其添加到JTable中,则它可以工作,但是它有两个缺点。

因此,我认为我可以使用fireTableDataChanged()方法解决此问题,但是我尝试了很多可能性,但没有任何改变。

您知道吗,我必须将fireevent放在哪里?

目前,我尝试了此操作,但是它不起作用,我也不知道为什么:



private ResultSetTableModel resultSetTableModel;
private DataFetcher dataFetcher;
private JTable table;

...

//works fine
public void initaialUpdateTable() {
    resultSetTableModel = new CachingResultSetTableModel(dataFetcher.getRS());
    table.setModel(resultSetTableModel);
}

//does not work
public void updateTable(){
    resultSetTableModel.setResultSet(dataFetcher.getRS());
    resultSetTableModel.fireTableDataChanged();
}


如果我每次都调用initaialUpdateTable(),它可以正常工作,但我希望仅更改数据而不是整个模型

谢谢你的回答

麦可

最佳答案

but i want that just the data changes and not the whole model


嗯,我怎么...,只有一个...

1)您可以在GUI中看到的是TableView,只有表示层,所有数据始终存储在TableModel

2)如果您不声明任何TableModel,这并不意味着不存在,而仍然存在DefaultTableModel

3)您的private ResultSetTableModel resultSetTableModel;必须扩展AbstractTableModel

4)如果您要阻止fireXxxXxxChanged();中的任何一个,则不会有任何更改返回到TableView

5)基本内容here,以fireTableCellUpdated(row, col);开头

编辑

有关TableModels herehere或搜索ResultSetTableModelTableFromDatabase的更多信息

07-24 09:18