2011-12-21 8 views
3

私はGLCanvasを付けたJFrameを持っています。 JFrameのComponent.printAll()メソッドを呼び出して、BufferedImageとImageIO.write()を使用してGraphics2Dオブジェクトをpngファイルに出力すると、printAll()メソッドはGLCanvasをキャッチしません。 JFrameはpng画像上にありますが、GLCanvasはすべて灰色です。JOGL:Component.printAll()を使用してJFrameのGLCanvasのスクリーンショットを撮ることはできません

私は何が欠けていますか?

問題を再現するためのサンプルコードです。コードを実行した後、 "image.png"という名前の生成されたpngファイルを見てください。 GLCanvasを除くすべてが表示されます。イメージを作成するコードスニペットは、コンストラクタの一番下にあります。

import com.sun.opengl.util.Animator; 
import java.awt.Graphics2D; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.*; 
import javax.imageio.ImageIO; 
import javax.media.opengl.*; 
import javax.media.opengl.glu.GLU; 
import javax.swing.JFrame; 

public class JOGLTest implements GLEventListener { 

    GLU glu = new GLU(); 
    JFrame frame = new JFrame("JOGL"); 
    GLCanvas canvas = new GLCanvas();  
    public static void main(String[] args) { 
     JOGLTest joglTest = new JOGLTest(); 
    } 

    public JOGLTest() { 
     canvas.addGLEventListener(this); 
     frame.add(canvas); 
     frame.setSize(500, 500); 
     final Animator animator = new Animator(canvas); 
     frame.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       new Thread(new Runnable() { 

        public void run() { 
         animator.stop(); 
         System.exit(0); 
        } 
       }).start(); 
      } 
     }); 

     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     animator.start(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(JOGLTest.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     BufferedImage image = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB);   
     Graphics2D g = image.createGraphics();   
     frame.printAll(g);   
     image.flush(); 

     try { 
      ImageIO.write(image, "png", new File("image.png")); 
     } catch (IOException ex) { 
      Logger.getLogger(JOGLTest.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void init(GLAutoDrawable drawable) { 
     GL gl = drawable.getGL(); 
     gl.setSwapInterval(1); 
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     gl.glShadeModel(GL.GL_SMOOTH); 
    } 

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { 
     GL gl = drawable.getGL(); 
     GLU glu = new GLU(); 
     if (height <= 0) {   
      height = 1; 
     } 
     final float h = (float) width/(float) height; 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     glu.gluPerspective(20.0f, h, 1.0, 550.0); 
     gl.glMatrixMode(GL.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    } 

    private int eyeX = 0; 
    private int eyeY = 0; 
    private int eyeZ = 130; 
    private int centerX = 0;  

    public void display(GLAutoDrawable drawable) { 
     GL gl = drawable.getGL(); 
     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
     gl.glLoadIdentity(); 
     glu.gluLookAt(eyeX, eyeY, eyeZ, centerX, 0.0, 0.0, 0.0, 1.0, -0.0); 
     gl.glBegin(GL.GL_LINES); 
     gl.glVertex2d(1, 1); 
     gl.glVertex2d(20, 20); 
     gl.glEnd(); 
     gl.glFlush(); 
    } 
    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { 
    } 
} 
+0

私のOpenGLでは多くの定数がありません。たとえば、私はGL.GL_PROJECTIONを参照していない.....あなたのバージョンを指定することはできますか – jayunit100

答えて

4

利用代わりGLCanvasのGLJPanel:

GLJPanel panel = new GLJPanel(); 

それからちょうどpanelであなたのcanvas変数を交換し、それが動作するはずです。 スイングコンポーネント内でGLCanvasを使用すると、互換性の問題が発生することがあります。 GLCanvas APIのページから

:ヘビー級を追加すると、いずれかの理由Z-発注またはLayoutManagerの問題により、動作しない場合

GLJPanelは、Swingのユーザーインターフェイスとの互換性のために提供されます。

関連する問題