该FEST框架有一个工具来检测摇摆使用关EDT。基本上是您安装的RepaintManager。该框架面向测试,但是可以在部署时使用RepaintManager。
- 请参阅FEST-Swing的事件调度线程
或者,要检查诸如getter和setter之类的所有方法仅可在EDT上访问,可以使用AspectJ和加载时编织将SwingUtilities.isDisaptchThread()建议添加到swing组件(和JDK
Swing组件)的每个方法上。 )
@Aspectpublic class EDTCheck { @Pointcut("call (* javax.swing..*+.*(..)) || " + "call (javax.swing..*+.new(..))") public void swingMethods() {} @Pointcut("call (* com.mystuff.swing..*+.*(..)) || " + "call (com.mystuff.swing..*+.new(..))") public void mySwingMethods() {} @Pointcut("call (* javax.swing..*+.add*Listener(..)) || " + "call (* javax.swing..*+.remove*Listener(..)) || " + "call (void javax.swing.JComponent+.setText(java.lang.String))") public void safeMethods() {} @Before("(swingMethods() || mySwingMethods()) && !safeMethods()") public void checkCallingThread(JoinPoint.StaticPart thisJoinPointStatic) { if(!SwingUtilities.isDispatchThread()) { System.out.println( "Swing single thread rule violation: " + thisJoinPointStatic); Thread.dumpStack(); // or you might throw an unchecked exception } }}
(在文章中稍作修改-
添加了mySwingMethods切入点,并使用SwingUtiliites.isDispatchThread()。实际上,它与EventQueue.isDispatchThread()相同,但是抽象更干净。)
- 请参阅使用AspectJ检测违反Swing单线程规则的情况
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)