如何在不设置新 table 模型的情况下刷新 JTable?

How to refresh a JTable without setting a new table model?

我正在尝试使用 DefaultTableModel 刷新 JTable,而无需再次访问 table 本身,而是仅访问现有但随后更新的 table 模型。

然而,我尝试更新 table 模型本身,然后通知模型(见代码)。由于某种原因,table 不会更新。我不知道,这是访问问题还是根本不可能。

//in the Gui_Main class 
private static void addTables(){
   JTable tblMain = new JTable(Util_Tables.dtm);
}

//in the Util_Tables class, if the tables needs to be updated
public static DefaultTableModel dtm;

public static void updateTable(){
   dtm = new DefaultTableModel(data, columns);
   dtm.fireTableDataChanged();
}

所以你的基本结构无处不在。当您创建 DefaultTableModel 的新实例并将其分配给 dtm 时,这不会被 JTable 反映出来,因为它仍在使用创建时首先获取的实例.

按照您的方式公开 dtm,打开它进行不需要的修改,并使 OO 的原则之一无效 - 封装,其中 class 负责管理其属性。这也是重新考虑使用 static

的原因

更好的开始是创建一个 getter,其中 return 是 DefaultTableModel 的单个实例,因此保证每次调用它都是 return 同一个实例DefaultTableModel 并阻止任何其他人更改基础引用

private static void addTables(){
   JTable tblMain = new JTable(Util_Tables.getModel());
}


//in the Util_Tables class, if the tables needs to be updated
private DefaultTableModel model;
public static DefaultTableModel getModel() {
    if (model == null) {
        model = new DefaultTableModel();
    }

}

好的,那么更新模型怎么样?好吧,您需要先修改 updateTable 方法,以便它可以用于以某种有意义的方式实际更新模型

public static void updateTable(Object[][] data, Object[] columnIdentifiers){
   model.setDataVector(data, columnIdentifiers);
}

模型随后将生成它自己需要的事件。如果您发现自己在调用 fireXxx 方法,那么这很好地表明您做错了什么。