2012-03-02 90 views
0

我在打印Java3d打印图形时遇到了一些麻烦某些计算机(基于Intel的图形卡)在打印时完全崩溃。我得到了这个例外。PrintCanvas3D将不起作用

javax.media.j3d.IllegalRenderingStateException: GL_VERSION 
    at javax.media.j3d.NativePipeline.createNewContext(Native Method) 
    at javax.media.j3d.NativePipeline.createNewContext(NativePipeline.java:2736) 
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:4895) 
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:2421) 
    at javax.media.j3d.Renderer.doWork(Renderer.java:895) 
    at javax.media.j3d.J3dThread.run(J3dThread.java:256) 

    DefaultRenderingErrorListener.errorOccurred: 
    CONTEXT_CREATION_ERROR: Renderer: Error creating Canvas3D graphics context 
    graphicsDevice = Win32GraphicsDevice[screen=0] 
    canvas = visualization.show3D.show.print.OffScreenCanvas3D[canvas0,0,0,3000x2167,invalid] 
    Java 3D ERROR : OpenGL 1.2 or better is required (GL_VERSION=1.1) 
    Java Result: 1 

我知道它说我已经升级到1.2的OpenGL检查,但之后我已经安装了1.5(错误信息是不准确的)

String glVersion = (String)getCanvas3D().queryProperties().get("native.version"); 

我试图抓住IllegalRenderingStateException但它没有工作,JVM只是在任何情况下崩溃。 没有人知道如何让打印功能在基于Intel的显卡上工作?

回答

0

我发现了我的问题的原因。 某些计算机没有PrintCanvas3D.java所需的OffScreenRendering支持。

所以我用机器人来创建屏幕捕获

public BufferedImage canvasCapture(Dimension size, Point locationOnScreen) { 
    Rectangle bounds = new Rectangle(locationOnScreen.x, locationOnScreen.y, size.width, size.height); 
    try{ 
    Robot robot = new Robot(this.getGraphicsConfiguration().getDevice()); 
    return robot.createScreenCapture(bounds); 
    }catch (Exception e){ 
    e.printStackTrace(); 
    return null; 
    } 
} 

末棘手的部分是检测时,从适当的印刷方法切换到抓屏方法(因为捕捉引发的异常不工作),经过一番搜索我发现queryProperties()可以给我这个信息

这里是我Frame3D代码来选择合适的方法

Boolean OffScreenRenderingSupport = (Boolean)getCanvas3D().queryProperties().get("textureLodOffsetAvailable"); 
if (OffScreenRenderingSupport){ 
    bImage = getOffScreenCanvas3D().doRender(dim.width, dim.height); 
}else{ 
    bImage = getOffScreenCanvas3D().canvasCapture(getCanvas3D().getSize(), getCanvas3D().getLocationOnScreen()); 
} 

如果有人能找到更好的方法来处理这个问题,请告诉我;)