首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Swing JTable 多執行緒操作解決 ArrayIndexOutOfBoundsException 問題

     編輯:Java 相關知識

高頻率新增/刪除 JTable 資料時,若直接在事件派發執行緒(EDT)外操作 DefaultTableModel,極易發生 ArrayIndexOutOfBoundsException。解決之道:所有模型變更務必封裝在 SwingUtilities.invokeLater 執行,確保單一執行緒存取模型。

問題重現與解決對比

// 直接操作模型 → 會拋出 ArrayIndexOutOfBoundsException
public void addValueWithoutThread(Vector value) {
    model.addRow(value);
    if (model.getRowCount() > 5) deleteRows(2);
}

// 包裝在 invokeLater → 穩定不報錯
public void addValueWithThread(final Vector value) {
    new Thread(() -> {
        SwingUtilities.invokeLater(() -> {
            model.addRow(value);
            if (model.getRowCount() > 5) deleteRows(2);
        });
    }).start();
}

完整範例程式

public class ThreadTable extends JTable {
    private DefaultTableModel model;
    static String[] header = {"id","name","sex","age"};

    public ThreadTable() {
        model = new DefaultTableModel(header, 0);
        setModel(model);
    }

    public void deleteRows(int rowCount) throws Exception {
        if (rowCount >= model.getRowCount()) throw new Exception("刪除行數超過總行數");
        for (int i = rowCount - 1; i >= 0; i--) model.removeRow(i);
    }

    public void testInsertValue() {
        Vector value = new Vector<>(Arrays.asList("0","simon","boy","21"));
        new Thread(() -> {
            for (int i = 0; i < 100000; i++) {
                addValueWithThread(value); // 或 addValueWithoutThread 對比
                try { Thread.sleep(10); } catch (InterruptedException ignored) {}
            }
        }).start();
    }

    // addValueWithThread / addValueWithoutThread 如上
    public static void main(String[] args) { /* 建立 JFrame 顯示 */ }
}

關鍵原則

  • Swing 模型(TableModel、ListModel、TreeModel 等)非執行緒安全,所有讀寫必須在 EDT 執行。
  • 背景執行緒準備資料後,透過 SwingUtilities.invokeLater(Runnable) 排程模型更新。
  • 若需批次更新,可在單一 invokeLater 中完成多筆增刪,減少重繪開銷。

遵循此模式,JTable 即使在極高頻率資料流下亦能穩定運作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved