我在 Java Swing 中更新 JTable 时遇到问题。
我想要显示的数据每秒变化几次,我正在寻找一种有效的方法来更新 JTable 中的数据。
我使用方法 setModel() 来更新数据,它有效,但它有两个缺点:
如果用户调整标题中表格列的大小,那么他将得到大约 10 个异常(我认为是因为该模型不再可用,因为它每秒更改几次)
每次数据(以及 TableModel)更改时,调整大小的列(以像素为单位)的长度信息都会丢失。
对于 TableModel,我使用我自己的模型 ResultSetTableModel,它扩展了 AbstractTableModel。
此 ResultSetTableModel 具有方法 setResultSet(ResultSet rs)
并覆盖方法 getValueAt(x,y)
...
正如我所说,如果我将一个新的 ResultSet 设置到我的 ResultSetTableModel,然后通过方法 setModel(resultSetTableModel) 将它添加到 JTable,它可以工作,但它有我所说的 2 个缺点。
所以我认为我可以使用 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(),它工作正常,但我希望只是数据发生变化而不是整个模型
感谢您的回答
迈克尔
最佳答案
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
关于java - fireTableDataChanged 对 JTable 没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210532/