0

JavaとJoglでプログラムを書きたいです。Jframe とそのフレーム内にある GLJPanel があります。プログラムはマウス イベントを受け取り、ユーザーがフレームをクリックすると、その位置に点が描画されます。このプログラムに次のコードを書きましたが、問題があります。フレームをクリックすると、そのクリックのイベントが発行されないか、遅延して発行されることがあります。これを修正する方法を教えてください。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogli;

import com.jogamp.opengl.util.FPSAnimator;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.awt.GLJPanel;
import javax.swing.JFrame;

/**
 *
 * @author HESSAM
 */
public class JOGLI extends JFrame {

    /**
     * @param args the command line arguments
     */
    private GLJPanel pan;

    public JOGLI()
    {
        pan = new Curve();
        this.setMinimumSize( new Dimension( 800 , 600 ) );
        this.add(pan);
        this.pack();
        this.setVisible(true);
        final FPSAnimator anime1 = new FPSAnimator( pan , 24 , true ); 
        anime1.start();
        this.addWindowListener( new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                // Use a dedicate thread to run the stop() to ensure that the
                // animator stops before program exits.
                new Thread() {
                   @Override
                   public void run() {
                      if (anime1.isStarted()) {
                           anime1.stop();
                       }                      
                      System.exit(0);
                   }
                }.start();         
            }
        });                                
    }
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JOGLI().setVisible(true);
            }
        });
        // TODO code application logic here
    }
}




/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogli;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLJPanel;

/**
 *
 * @author HESSAM
 */
public class Curve extends GLJPanel implements GLEventListener {
    private ArrayList < int[] > pointSet;
    private GL2 mygl;
    public Curve()
    {        
        pointSet = new ArrayList<>();
        this.addGLEventListener(this);
        this.addMouseListener( new MouseAdapter() {
            @Override
            public void mouseClicked( MouseEvent e )
            {
                final int[] newPoint = { 0 , 0 , 0 };
                newPoint[0] = e.getX();
                newPoint[1] = getSize().height - e.getY();                                
                pointSet.add(newPoint);
                display();

            }
        });
    }
    @Override
    public void init(GLAutoDrawable drawable) { 
        mygl = drawable.getGL().getGL2();
        mygl.glClearColor(0.15f, 0.15f , 0.15f , 1);
        mygl.glClear(mygl.GL_COLOR_BUFFER_BIT);
        mygl.glLoadIdentity();
        mygl.glMatrixMode(mygl.GL_PROJECTION);
        mygl.glLoadIdentity();
        mygl.glOrtho(0, getSize().width, 0, getSize().height, -1, 1);
        mygl.glMatrixMode(mygl.GL_MODELVIEW);
    }

    @Override
    public void dispose(GLAutoDrawable drawable) {        
    }

    @Override
    public void display(GLAutoDrawable drawable) { 
        mygl = drawable.getGL().getGL2();
        mygl.glClear(mygl.GL_COLOR_BUFFER_BIT);
        mygl.glBegin(mygl.GL_POINTS);
        {
            mygl.glColor3d(1, 0.1, 0.5);
            for( int i = 0 ; i < pointSet.size() ; ++i )
            {
                for(int j = -2 ; j <= 2 ; ++j ) {
                    for(int k = -2 ; k <= 2 ; ++k ) {
                        mygl.glVertex2d(pointSet.get(i)[0] + j, pointSet.get(i)[1] + k);
                    }
                }
            }
        }
        mygl.glEnd();
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {        
    }

}
4

1 に答える 1

3

AWT の入力 EventDispatchThread はレンダリングによってブロックされ、その逆も同様です。これは、入力とレンダリングを単一のスレッドで実行するため、AWT による設計上の制限です。

JogAmp JOGL NEWT 入力およびウィンドウ システムを使用することをお勧めします。NEWT は、レンダリングと並行して入力を行うように設計されています。GLWindow (NEWT) を直接使用するか、NewtCanvasAWT (AWT アプリケーション内の GLWindow) を使用してから、NEWTEventFiFo を使用して入力をレンダリング ループに挿入します。 http://jogamp.org/jogl/doc/NEWT-Overview.html

于 2013-05-03T16:05:54.493 に答える