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

时间:2019-06-02 22:10:50

标签: java swing jtable defaulttablemodel

我试图使用JTable刷新DefaultTableModel,而不必再次访问表本身,而只访问现有的但已更新的表模型。

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

//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();
}

1 个答案:

答案 0 :(得分:2)

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

dtm的方式进行公开,将其开放给不良的修改,并使OO的原理之一-封装(encapsulation),其中类负责其属性的管理。这也是重新考虑使用static

的原因

一个更好的开始是创建一个返回单个DefaultTableModel实例的getter,因此可以确保每次调用都返回相同的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方法,那么就说明您做错了什么。