Printing PrintCanvas3D赢得';行不通

Printing PrintCanvas3D赢得';行不通,printing,render,java-3d,canvas3d,Printing,Render,Java 3d,Canvas3d,我在尝试从Java3d打印图形时遇到一些问题一些计算机(基于Intel的图形卡)在打印时完全崩溃。我得到了这个例外 javax.media.j3d.IllegalRenderingStateException: GL_VERSION at javax.media.j3d.NativePipeline.createNewContext(Native Method) at javax.media.j3d.NativePipeline.createNewContext(Nati

我在尝试从Java3d打印图形时遇到一些问题一些计算机(基于Intel的图形卡)在打印时完全崩溃。我得到了这个例外

    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
我知道它说我必须升级到OpenGL 1.2,但检查后我已经安装了1.5(错误消息不准确)

我试图捕获IllegalRenderingStateException,但它不起作用,JVM在任何情况下都会崩溃。
难道没有人知道如何在基于英特尔的图形卡上使用打印功能吗?

我找到了问题的原因。 有些计算机没有PrintCanvas3D.java所需的偏移渲染支持

所以我用机器人制作了一个屏幕截图

 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());
}
如果有人能找到更好的解决方法,请告诉我;)

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