fireTableDataChanged对JTable没有影响

时间:2011-08-26 21:01:45

标签: java swing user-interface jtable

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

我想要显示的数据每秒更改几次,我寻找一种更新JTable中数据的有效方法。

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

  1. 如果用户调整标题中的表格列的大小,那么他将获得大约10个例外(我认为因为模型不再可用,因为它每秒更改几次)

  2. 每次数据(以及TableModel)都发生变化时,已调整大小的列(Pixel)的长度信息也会丢失。

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

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

    所以我认为我可以使用fireTableDataChanged()方法解决这个问题,但我尝试了很多可能性但没有改变。

    你知道吗,我必须在哪里放置?

    目前我尝试了这个,但它不起作用,我不知道原因:

    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(),它工作正常,但我希望只是数据更改而不是整个模型

    感谢您的回答

    迈克尔

2 个答案:

答案 0 :(得分:1)

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

的更多信息

答案 1 :(得分:0)

抱歉,我对你的问题没有具体的答案,但我不太适合我想在评论中说出的所有内容。

  

我使用方法setModel()来更新数据

您应该坚持使用提供修改数据方法的单一模型。当某些事情发生变化时,这些方法应适当地通知听众。

这是一篇非常棒的文章,展示了如何使用频繁更改的数据实现高性能,多线程表。你可以使用很多示例源代码。