2017-03-19 4 views
1

Ich sehe manchmal die folgende Stacktrace Tests mit UISpec4j gebaut laufenClasscast mit 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) 
    ... 

Die Ursache scheint eine niedergeschlagenen statt java.awt.Graphics2D zu SunGraphics2D tun ungezogen JDK Code zu sein in java.awt.Component.BltBufferStrategy.getDrawGraphics()

/** 
    * @return the draw graphics 
    */ 
    public Graphics getDrawGraphics() { 
     revalidate(); 
     Image backBuffer = getBackBuffer(); 
     if (backBuffer == null) { 
      return getGraphics(); 
     } 
     SunGraphics2D g = (SunGraphics2D)backBuffer.getGraphics(); 
     g.constrain(-insets.left, -insets.top, 
        backBuffer.getWidth(null) + insets.left, 
        backBuffer.getHeight(null) + insets.top); 

Mache ich etwas falsch, da ich sonst nirgendwo Hinweise finden kann ..?

Problemumgehungen? Alles, was ich denken kann, ist, die Ausnahme in meinem Test zu schlucken, nicht ideal.

Antwort

0

Dies scheint eine nicht dokumentierte Merkmal JDK die, wenn sie sich, wie es mit dem Test-Framework UISpec4J

verwendet eine andere Implementierung der Graphics2D nur ausgesetzt ist

Weitere Debugging zeigt dies nur auf bestimmten Plattformen passiert, wo die Beschleunigung verwendet wird. Die Route durch javax.swing.JComponent._paintImmediately (int, int, int, int) unterscheidet, wenn das doppelte Pufferung freigegeben ist die Ausnahme

Als Abhilfe wird ausgelöst, kann dies mit der folgenden deaktiviert werden, die die Ausnahme vermeidet

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