我在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 here,here或搜索
ResultSetTableModel
,TableFromDatabase
的更多信息