在之前的询问中,您提到遇到了无法在 SwingWorker 线程中处理的异常。本文深入探讨了生成源自 RepaintManager 类的异常的具体问题。
1.使用 CheckThreadViolationRepaintManager:
生成此类异常的经过验证的方法是使用 CheckThreadViolationRepaintManager 类。该自定义类扩展了 RepaintManager 并拦截重绘或脏区域添加操作。如果这些操作发生在事件调度线程之外,则会触发异常并打印其堆栈跟踪。
public class CheckThreadViolationRepaintManager extends RepaintManager { // Override methods to check for thread violations and print stack trace if found }
2.设置RepaintManager:
创建CheckThreadViolationRepaintManager实例后,需要将其设置为当前重绘管理器:
RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
3.触发违规:
要触发异常,请从事件调度线程以外的线程执行重绘或脏区域添加操作。异常将被抛出并打印到控制台。
示例:
public static void main(String[] args) { RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager()); // Create a frame and repaint it from a separate thread JFrame frame = new JFrame(); SwingUtilities.invokeLater(() -> frame.repaint()); }
此代码将导致 CheckThreadViolationRepaintManager 从后台线程检测重绘操作,并打印异常。
以上是如何在 Swing 中触发 RepaintManager 异常?的详细内容。更多信息请关注PHP中文网其他相关文章!