数据更改后重新加载 JTable 的对象[][]



我想知道当用于最初填充表的Object[][]发生变化时,是否可以刷新表的 GUI。

Object[][] calculationsTableData;
public Interface() {
    ...
    analysisPanel.add(calculationsTable());
    ...
}
JScrollPane calculationsTable() {
    populateCalculationsTableData();
    ...
    calculationsTable = new JTable(calculationsTableData, calculationsColumnNames);
    ...
}
void populateCalculationsTableData(){
    Object[][] temp = new Object[x.numsSize][7];
    for (int i = 0; i < x.numsSize; i++) {
        temp[i][0] = df.format(x.nums[i]);
        ...
    }
    calculationsTableData = temp;
}

当 x 对象更改为重新填充calculationsTableData时调用populateCalculationsTableData()

在这种情况下,repaint()revalidate()方法似乎无效,fireTableDataChanged()也无效,因为这不是表模型。

默认情况下,如果没有显式设置表模型,JTable 会创建DefaultTableModel AbstractTableModel [1] 实现的新实例。如果需要更新表,则必须使用其模型。

你可以...

设置一个新的 DefaultTableModel:

void populateCalculationsTableData() {
    ...
    calculationsTableData = temp;
    TableModel model = new DefaultTableModel(calculationsTableData, calculationsColumnNames);
    calculationsTable.setModel(model);
}

或者你可以...

使用DefaultTableModel创建表:

TableModel model = new DefaultTableModel(calculationsTableData, calculationsColumnNames);
calculationsTable = new JTable(model);

将表模型转换为DefaultTableModel,并按如下所示设置其数据和列:

void populateCalculationsTableData() {
    ...
    calculationsTableData = temp;
    DefaultTableModel model = (DefaultTableModel)calculationsTable.getModel();
    model.setDataVector(calculationsTableData, calculationsColumnNames);
}

推荐阅读材料

  • JTable(Object[][] rowData, Object[] columnNames)
  • DefaultTableModel#setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
  • 如何使用表格

[1]:在检查了源代码JTable(Object[][] rowData, Object[] columnNames)我意识到没有创建DefaultTableModel,而是从AbstractTableModel扩展一个新的匿名内部类。

我会创建你自己的表模型来包装对象数组,并公开fireTableDataChanged()方法:

private static class ObjectArrayModel extends AbstractTableModel {
    private final Object[][] rowData;
    private final Object[] columnNames;
    private ObjectArrayModel(Object[][] rowData, Object[] columnNames) {
        this.rowData = rowData;
        this.columnNames = columnNames;
    }
    @Override
    public void fireTableDataChanged() {
        super.fireTableDataChanged();
    }
    public String getColumnName(int column) {
        this.fireTableDataChanged();
        return columnNames[column].toString();
    }
    public int getRowCount() {
        return rowData.length;
    }
    public int getColumnCount() {
        return columnNames.length;
    }
    public Object getValueAt(int row, int col) { return rowData[row][col]; }
    public boolean isCellEditable(int row, int column) { return true; }
    public void setValueAt(Object value, int row, int col) {
        rowData[row][col] = value;
        fireTableCellUpdated(row, col);
    }
}

。当数据发生变化时,您应该能够对此调用fireTableDataChanged(),它将通知需要重新绘制自己的表。

最新更新