我想知道当用于最初填充表的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 会创建 AbstractTableModel [1] 实现的新实例。如果需要更新表,则必须使用其模型。DefaultTableModel
你可以...
设置一个新的 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(),它将通知需要重新绘制自己的表。