在运行时Swing验证Event Dispatch Thread上的代码

Jef*_*rey 10 java swing event-dispatch-thread

是否有任何库可以检测代码以验证在事件调度线程上调用Swing组件上调用的方法?编写一些用于执行此操作的基本代码可能不会太困难,但我确信有其他人处理的边缘情况.我在运行时寻找这个,而不是单元测试.

mdm*_*dma 11

FEST框架有一个工具来检测摇摆使用关EDT.它基本上是您安装的RepaintManager.该框架面向测试,但RepaintManager可以在部署时使用.

或者,要检查所有方法(例如getter和setter)以便仅在EDT上访问,可以使用AspectJ和加载时编织将SwingUtilities.isDisaptchThread()建议添加到swing组件(以及JDK Swing组件)上的每个方法. )

@Aspect
public 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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

(稍微修改了文章 - 添加了mySwingMethods切入点,并使用SwingUtiliites.isDispatchThread().实际上它与EventQueue.isDispatchThread()相同,但抽象更清晰.)