单击“加载”按钮时,我试图刷新我的表格面板。单击GUI中的LOAD按钮将称为replaceText()方法。新的columnNames列表和显示内容将被发送以更新扩展了AbstractTableModel的tableModel。然后调用table.updateUI()刷新表。
public class Table {
private JPanel panel;
private TableModel model;
private JTable table;
private JScrollPane scrollPane;
public Table(){
this.panel = new JPanel();
this.model = new TableModel();
this.table = new JTable(model);
this.scrollPane = new JScrollPane(table);
}
public void replaceText(ArrayList<String> names, String[][] content){
model.update(names, content);
table.updateUI();
}
public JPanel build(){
panel.setSize(1000, 300);
panel.setLayout(new BorderLayout());
panel.add(scrollPane, BorderLayout.CENTER);
panel.setVisible(true);
return panel;
}
}
这是我的tableModel中的代码:
public class TableModel extends AbstractTableModel {
String[] colNames = new String[] {};
String[][] content = new String[][] {};
@Override
public int getRowCount() {
return content.length;
}
@Override
public int getColumnCount() {
return colNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return content[rowIndex][columnIndex];
}
public String getColumnName(int columIndex){
return colNames[columIndex];
}
public void update(ArrayList<String> names, String[][] content){
this.colNames = names.toArray(new String[0]);
this.content = content;
}
}
最佳答案
public class TableModel extends AbstractTableModel {
有一个名为
TableModel
的接口。不要将类与接口命名。令人困惑。table.updateUI();
您不应该调用updateUI()。当您更改LAF时,Swing仅在内部使用该方法。更改数据不会更改LAF。
当更改模型数据时,“模型”负责更新“视图”。
public void update(ArrayList<String> names, String[][] content){
this.colNames = names.toArray(new String[0]);
this.content = content;
}
您的update(…)方法不会通知视图数据已更改。这可以通过调用以下命令来完成:
fireTableStructureChanged(…);
update(…)方法中AbstractTableModel的方法。
但是,我认为没有理由创建自定义TableModel。我建议您只使用
DefaultTableModel
。它具有方法setDataVector(…)
,该方法允许您重置模型中的数据。