SwingWorker 執行緒中產生RepaintManager 例外狀況
在處理相關問題時,發現RepaintManager 中的特定執行緒可能很難處理從SwingWorker 擷取執行相關問題時,發現RepaintManager 中的特定執行緒可能很難處理從SwingWorker 擷取程式碼和輸出。本文將深入探討產生 RepaintManager 異常的主題並提供解決方案。
方法:利用 CheckThreadViolationRepaintManager
CheckThreadViolationRepaintManager 類別允許偵測 Swing 中的執行緒基於應用程式。透過將其設定為當前重繪管理器,它可以監視元件失效和髒區域添加,以確保它們在事件調度執行緒(EDT)上執行。當發生違規時,會引發異常。
提供的範例透過在框架 UI 委託初始化的各個階段引發異常來示範此類的用法。事實證明,這種方法可以有效檢測和列印多種類型的 RepaintManager 異常。
語法與實作:
import javax.swing.RepaintManager; import javax.swing.SwingUtilities; public class RepaintManagerExceptions { public static void main(String[] args) { RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager()); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } private static class CheckThreadViolationRepaintManager extends RepaintManager { @Override public void addInvalidComponent(JComponent component) { checkThreadViolations(component); super.addInvalidComponent(component); } @Override public void addDirtyRegion(JComponent component, int x, int y, int w, int h) { checkThreadViolations(component); super.addDirtyRegion(component, x, y, w, h); } private void checkThreadViolations(JComponent component) { if (!SwingUtilities.isEventDispatchThread()) { violationFound(component, Thread.currentThread().getStackTrace()); } } protected void violationFound(JComponent component, StackTraceElement[] stackTrace) { System.out.println("EDT violation detected."); System.out.println(component); for (StackTraceElement st : stackTrace) { System.out.println("\tat " + st); } } } }
結論:
透過利用CheckThreadViolationRepaintManager ,提供有關Swing 應用程式中線程違規的寶貴見解。這使開發人員能夠識別並解決與 EDT 合規性相關的潛在問題,確保應用程式執行更順暢、更可靠。
以上是如何從 SwingWorker 線程產生並捕獲 RepaintManager 異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!