2012-03-02 4 views
0

J'ai quelques problèmes pour imprimer des graphiques à partir de Java3d certains ordinateurs (cartes graphiques Intel) se brisent complètement lors de l'impression. J'ai cette exception.PrintCanvas3D ne fonctionnera pas

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 

Je sais que dit que je dois passer à OpenGL 1.2 mais après avoir déjà 1,5 i vérifier installé (message d'erreur est pas exacte)

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

J'ai essayé d'attraper IllegalRenderingStateException mais il ne travail, JVM juste tomber en panne dans tous les cas. Personne ne sait comment avoir une fonction d'impression pour travailler sur des cartes graphiques Intel?

Répondre

0

J'ai découvert la cause de mon problème. Certains ordinateurs n'ont pas le support OffScreenRendering requis par PrintCanvas3D.java.

donc j'ai utilisé robot pour créer une capture d'écran

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; 
    } 
} 

Dernière partie la plus délicate était de détecter quand passer d'méthode d'impression appropriée à la méthode ScreenCapture (depuis la capture l'exception soulevée ne fonctionne pas), après un certain recherche Je découvert que queryProperties() pourrait me donner ces informations

est le code ici dans mon Frame3D choisir la méthode appropriée

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

Si quelqu'un peut trouver une meilleure façon de gérer cela, s'il vous plaît faites le moi savoir;)