我试图使用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();
}
答案 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
方法,那么就说明您做错了什么。