현재 JOGL을 실험하고 있으며, 실제로 나에게 새로운 문제가 발생했습니다. 프로그램을 시작하면 빈 창이 보입니다. 크기를 조정 한 후에는 일반적으로 내용을 볼 수도 있고 최소화/복원을 수행 할 수도 있습니다. 사건과 관련이 있다고 생각합니다. init()은 창을 만든 후에는 호출되지 않지만 크기 조정 또는 최소화가있는 첫 번째 트리거 이후에 호출됩니다. 여기 JFrame + JOGL은 크기를 조정하거나 최소화하고 최대화했을 때만 콘텐츠를 표시합니다.
내가 창을 생성 및 OpenGL을 설정하기 위해 사용하고 무엇 코드 :package com.cogwheel.framework.graphics;
import java.awt.BorderLayout;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.*;
import javax.swing.JFrame;
import com.cogwheel.framework.init.CWGPreferences;
import com.cogwheel.framework.util.CWGDebug;
import com.jogamp.opengl.util.Animator;
public class CWGOpenGLScreen extends JFrame implements GLEventListener {
private static final String TAG = "CWGOpenGLScreen";
private GLCanvas mCanvas;
private long fpsLast = System.currentTimeMillis();
public CWGOpenGLScreen(){
this.setTitle(CWGPreferences.WINDOW_NAME);
this.setSize(CWGPreferences.WINDOW_SIZE);
this.setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
///this.setResizable(false);
this.setVisible(true);
CWGDebug.info(TAG, "Window created!");
CWGSetupGL();
}
private void CWGSetupGL(){
GLCapabilities mCaps = new GLCapabilities(null);
mCaps.setHardwareAccelerated(true);
mCaps.setDoubleBuffered(true);
mCanvas = new GLCanvas(mCaps);
mCanvas.addGLEventListener(this);
this.add(mCanvas, BorderLayout.CENTER);
Animator animator = new Animator(mCanvas);
animator.start();
}
public void CWGDrawScene(GLAutoDrawable drawable)
{
CWGCalculateFPS();
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
gl.glBegin(GL.GL_TRIANGLES);
gl.glColor3f(1.0f, 0.0f, 0.0f);
gl.glVertex3f(1.0f/5 , 0.0f, 0.0f);
gl.glColor3f(0.0f, 1.0f, 0.0f);
gl.glVertex3f(1.0f/5, 1.0f/5, 0.0f);
gl.glColor3f(0.0f, 0.0f, 1.0f);
gl.glVertex3f(0.0f, 1.0f/5, 1.0f/5);
gl.glEnd();
gl.glFlush();
}
public void CWGCalculateFPS(){
this.setTitle(CWGPreferences.WINDOW_NAME + " [" + 1000/(System.currentTimeMillis() - fpsLast) + "]");
fpsLast = System.currentTimeMillis();
}
public void init(GLAutoDrawable drawable){
/*GL2 gl = drawable.getGL().getGL2();
gl.glClearColor(0, 0, 0, 0);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(0, 1, 0, 1, -1, 1);
*/
CWGDebug.info(TAG, "Init called!");
}
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height){}
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged){}
public void display(GLAutoDrawable drawable){ CWGDrawScene(drawable); }
public void dispose(GLAutoDrawable drawable){}
}
코드 품질이 좋지, 내가 알고, 아직 정리에 시간이 없었습니다. 죄송합니다.
편집 : 문제가 발생하면 JFrame은 GLEventListener가 초기화되지 않을 때 표시되어서는 안됩니다.