2012-05-11 14 views
1

現在、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が初期化されない限り表示されません。

答えて

0

私はあなたのエラーを見つけました(それは日食とは関係ありません):glViewport(x、y、widhtなど)を呼び出すようにキャンバスのサイズが変更されたときは常にビューポート(glViewportへの呼び出し)高さ)をGLEventListenerのreshape()メソッドで返します。そのため、OpenGLはフレームのサイズを変更するときだけでなく、シーンを描画する場所を常に知っています。また

は、(少しだけ時間を、そうでないあなたはまだ同じ問題を抱えているだろう)それは表示する前 (CWGSetupGL()への呼び出し)の設定画面に忘れないでください。

ここで変更されたコード(あなたはこのクラスを提供しなかったとして、私はCWGDebug.infoへの呼び出しを削除したが、あなたがそれらを元に戻すことができます):

package com.cogwheel.framework.graphics; 

import java.awt.BorderLayout; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

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.GLCanvas; 
import javax.swing.JFrame; 

import com.jogamp.opengl.util.Animator; 

public class CWGOpenGLScreen extends JFrame implements GLEventListener { 

    public static void main(String[] args) { 
     new CWGOpenGLScreen().setVisible(true); 
    } 

private static final long serialVersionUID = 635066680731362587L; 

private static final String TAG = "CWGOpenGLScreen"; 

private GLCanvas mCanvas; 
private long fpsLast = System.currentTimeMillis(); 

public CWGOpenGLScreen(){ 
    this.setTitle(TAG); 
    this.setSize(640,480); 
    this.setLayout(new BorderLayout()); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ///this.setResizable(false); 

    CWGSetupGL(); 
    this.setVisible(true); 

// CWGDebug.info(TAG, "Window created!"); 
} 
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); 

    final Animator animator = new Animator(mCanvas); 
    animator.start(); 

    addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent e) { 
      animator.stop(); 
      System.exit(0); 
     } 



    }); 
} 

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(TAG + " [" + 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){ 
    GL2 gl = drawable.getGL().getGL2(); 
    gl.glViewport(x, y, width, height); 
} 
//public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged){} 
public void display(GLAutoDrawable drawable){ CWGDrawScene(drawable); } 
public void dispose(GLAutoDrawable drawable){} 
} 

よろしく:)

編集:あなたがあなた自身の質問に自分自身で答えるのを編集で見たことはありません。 とにかく、私はまだあなたがreshape()メソッドでglViewportを呼び出す方が良いと思います。

関連する問題