我在Java Swing中更新JTable时遇到问题。
我想要显示的数据每秒更改几次,我寻找一种更新JTable中数据的有效方法。
我使用方法setModel()来更新数据,它可以工作,但它有两个缺点:
如果用户调整标题中的表格列的大小,那么他将获得大约10个例外(我认为因为模型不再可用,因为它每秒更改几次)
每次数据(以及TableModel)都发生变化时,已调整大小的列(Pixel)的长度信息也会丢失。
对于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(),它工作正常,但我希望只是数据更改而不是整个模型
感谢您的回答
迈克尔
答案 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 here,here或搜索ResultSetTableModel
,TableFromDatabase
答案 1 :(得分:0)
抱歉,我对你的问题没有具体的答案,但我不太适合我想在评论中说出的所有内容。
我使用方法setModel()来更新数据
您应该坚持使用提供修改数据方法的单一模型。当某些事情发生变化时,这些方法应适当地通知听众。
这是一篇非常棒的文章,展示了如何使用频繁更改的数据实现高性能,多线程表。你可以使用很多示例源代码。