2012-03-02 88 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()); 
} 

如果有人能找到更好的方法來處理這個問題,請告訴我;)