Java 使用UISpec4j的ClassCastException

Java 使用UISpec4j的ClassCastException,java,swing,uispec4j,Java,Swing,Uispec4j,我有时会看到以下stacktrace运行使用UISpec4j构建的测试 java.lang.ClassCastException: org.uispec4j.interception.toolkit.Empty$DummyGraphics2D cannot be cast to sun.java2d.SunGraphics2D at java.awt.Component$BltBufferStrategy.getDrawGraphics(Component.java:4348)

我有时会看到以下stacktrace运行使用UISpec4j构建的测试

java.lang.ClassCastException: org.uispec4j.interception.toolkit.Empty$DummyGraphics2D cannot be cast to sun.java2d.SunGraphics2D
    at java.awt.Component$BltBufferStrategy.getDrawGraphics(Component.java:4348)
    at javax.swing.BufferStrategyPaintManager.prepare(BufferStrategyPaintManager.java:522)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:276)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5167)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4978)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4990)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:371)
    ...
根本原因似乎是顽皮的JDK代码在
java.awt.Component.BltBufferStrategy.getDrawGraphics()中对SunGraphics2D而不是java.awt.Graphics2D进行向下转换

我是不是做错了什么,因为我在其他地方找不到这方面的任何参考


变通办法?我所能想到的就是在我的测试中吞下这个异常,这并不理想。

这似乎是JDK的一个未记录的特性,它只有在不同的Graphics2D实现与UISpec4J测试框架一起使用时才会暴露出来

进一步的调试表明,这只发生在某些使用加速的平台上。通过javax.swing.JComponent的路径不同。如果启用双缓冲,则抛出异常

作为一种解决方法,可以使用以下选项禁用此选项,以避免出现异常

RepaintManager.currentManager(null).setDoubleBufferingEnabled(false);

这是JDK的一个未记录的特性,只有在与UISpec4J测试框架一起使用Graphics2D的不同实现时才会公开

进一步的调试表明,这只发生在某些使用加速的平台上。通过javax.swing.JComponent的路径不同。如果启用双缓冲,则抛出异常

作为一种解决方法,可以使用以下选项禁用此选项,以避免出现异常

RepaintManager.currentManager(null).setDoubleBufferingEnabled(false);