首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java JTable 刷新顯示資料:fireTableDataChanged、TableModel 替換與 SwingUtilities.invokeLater 正確姿勢

     編輯:程式設計綜合問答

常見錯誤

僅呼叫 frame.repaint() 或 table.repaint(),**不更新 TableModel**,視圖無資料可繪 → 介面不變。

核心原則:模型驅動視圖

  • JTable 透過 TableModel 獲取資料。
  • 資料變更必須通過 TableModel 方法修改,並觸發 TableModelEvent。

三種刷新方案

1. 繼承 AbstractTableModel,資料變更後 fireTableDataChanged()


class MyModel extends AbstractTableModel {
    List data = new ArrayList<>();
    public void setData(List newData) {
        this.data = newData;
        fireTableDataChanged(); // 通知 JTable 重新讀取所有儲存格
    }
    // 實作 getRowCount, getColumnCount, getValueAt...
}

2. 直接替換 TableModel (簡單粗暴)


table.setModel(new MyModel(newData)); // 新模型自動觸發重繪
// 或
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);
newData.forEach(row -> model.addRow(row.toArray()));

3. 非 EDT 執行緒更新資料,需 SwingUtilities.invokeLater


new Thread(() -> {
    List fresh = fetchFromDB();
    SwingUtilities.invokeLater(() -> tableModel.setData(fresh));
}).start();

參考資源

JTable 刷新數據的幾種方法 (CSDN) — 含完整代碼範例。

  1. 上一篇文章:
  2. 下一篇文章:
控制台程序運行後窗口一閃即關閉的解決方法 HTML 頁面中可放置多組