在接收訊息執行緒直接呼叫 textArea.append(msg) → **違反 Swing 單執行緒規則**,導致 UI 凍結或異常。
// 接收執行緒
public void run() {
while (running) {
String msg = socket.readLine();
final String finalMsg = msg;
SwingUtilities.invokeLater(() -> {
textArea.append(finalMsg + "\n");
textArea.setCaretPosition(textArea.getDocument().getLength());
});
}
}
SwingWorker 封裝背景任務,process() / done() 自動在 EDT 執行。BlockingQueue,UI 執行緒定時輪詢或由 DocumentListener 觸發更新。**所有 Swing 元件操作必須在 Event Dispatch Thread (EDT) 執行**,背景執行緒僅負責資料準備,透過 invokeLater 或 SwingWorker 安全轉派。