java – 在运行时的事件分派线程上的Swing验证代码

有没有任何库可以用代码来验证在事件调度线程上调用了Swing组件的方法?编写一些基本代码可能不会太难,但我确定有边缘案例,而其他人没有处理.我正在运行时寻找这个,而不是单元测试.

解决方法

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

>见FEST – Swing’s Event Dispatch Thread

或者,要检查所有方法,如getters和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
        }
    }

}

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

>见Using AspectJ to detect violations of the Swing Single-Thread Rule

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...