【问题标题】:Reload JTable's Object[][] after data has changed数据改变后重新加载 JTable 的 Object[][]
【发布时间】:2015-01-19 16:28:12
【问题描述】:

我想知道当最初填充表格的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;
}

populateCalculationsTableData() 在 x 对象已更改以重新填充 calculationsTableData 时调用

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

【问题讨论】:

    标签: java arrays swing jtable


    【解决方案1】:

    默认情况下,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);
    }
    

    建议阅读


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

    【讨论】:

      【解决方案2】:

      我会创建您自己的表模型来包装对象数组,并公开 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(),它会通知需要重绘自身的表。

      【讨论】:

        猜你喜欢
        • 2013-05-08
        • 1970-01-01
        • 2018-07-02
        • 2014-05-23
        • 1970-01-01
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        相关资源
        最近更新 更多