单击“加载”按钮时,我试图刷新我的表格面板。单击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(…),该方法允许您重置模型中的数据。

09-13 02:06