簡體   English   中英

JOGL:使用Component.printAll()在JFrame中截取GLCanvas的屏幕截圖不起作用

[英]JOGL: Taking a screenshot of a GLCanvas in a JFrame using Component.printAll() doesn´t work

我有一個帶有GLCanvas的JFrame。 當我調用JFrame的Component.printAll()方法然后將Graphics2D對象打印到png文件(使用BufferedImage和ImageIO.write() )時, printAll()方法沒有printAll() GLCanvas。 JFrame位於png圖像上,但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) {
    }
}

使用GLJPanel而不是GLCanvas:

GLJPanel panel = new GLJPanel();

然后用panel替換你的canvas變量,它應該工作。 在swing組件中使用時,GLCanvas有時會導致兼容性問題。

來自GLCanvas api頁面:

由於Z-ordering或LayoutManager問題,添加重量級時,GLJPanel與Swing用戶界面兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM