Java 如何让KeyListener正确使用JOGL?

Java 如何让KeyListener正确使用JOGL?,java,opengl,keylistener,jogl,Java,Opengl,Keylistener,Jogl,我试图使用KeyListener来更改一个值,特别是rtri,从而更改动画的工作方式。我的密码有点满了,所以提前道歉 我尝试在setup()中创建一个KeyListener实例,并使用.addKeyListener()将其添加到画布中 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import javax.swing.JFrame; import com

我试图使用KeyListener来更改一个值,特别是rtri,从而更改动画的工作方式。我的密码有点满了,所以提前道歉

我尝试在setup()中创建一个KeyListener实例,并使用.addKeyListener()将其添加到画布中

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import com.jogamp.opengl.util.FPSAnimator;

public class Frame implements GLEventListener, KeyListener {

    public final double pi2 = (2 * Math.PI);
    private GLU glu = new GLU();
    private float rtri = 0.0f;
    private static ArrayList<Star> stars = new ArrayList<Star>();
    private static float zFloat = 1.0f;

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyChar() == KeyEvent.VK_UP) {
            rtri += 0.5f;
            System.out.println(rtri);
            System.out.println("Increase");
        }
        else if (e.getKeyChar() == KeyEvent.VK_DOWN) {
            rtri -= 0.5f;
            System.out.println(rtri);
            System.out.println("Decrease");
        }
    }


    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {  
    }

    @Override
    public void display(GLAutoDrawable drawable) {
            final GL2 gl = drawable.getGL().getGL2();

        gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
        gl.glLoadIdentity(); // Reset The View
        gl.glTranslatef( 0.0f, 0.0f, -2.0f ); // Move the plane of stars

        gl.glRotatef( rtri, 0.0f, -2.0f, zFloat ); // Rotate the plane

        for (int sNum = 0; sNum < stars.size(); sNum++) {
            drawStar(stars.get(sNum), gl);
            }

        gl.glFlush();
            rtri+= 5.0f;

    }

    @Override
    public void dispose(GLAutoDrawable drawable) {

    }

    @Override
    public void init(GLAutoDrawable drawable) {
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, 
        int height) {
        final GL2 gl = drawable.getGL().getGL2(); 
           // get the OpenGL 2 graphics object  
        if(height <=0)
        height =1;
           //preventing divided by 0 exception height =1;
        final float h = (float) width / (float) height;
           // display area to cover the entire window
        gl.glViewport(0, 0, width, height);
           //Transforms projection matrix
            gl.glMatrixMode(GL2.GL_PROJECTION);
            gl.glLoadIdentity();
            glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
           //transforming model view gl.glLoadIdentity();
            gl.glMatrixMode(GL2.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public void setup() {
        final GLProfile profile = GLProfile.get(GLProfile.GL2);
        GLCapabilities capabilities = new GLCapabilities(profile);


        final GLCanvas canvas = new GLCanvas(capabilities);
        Frame bFrame = new Frame();

        canvas.addGLEventListener(bFrame);
        canvas.addKeyListener(this);
        canvas.setSize(900, 900);

        final JFrame frame = new JFrame("Test Window");

        frame.add(canvas);
        frame.setSize(900, 900);
        frame.setVisible(true);

        final FPSAnimator animator = new FPSAnimator(canvas, 60,true);
        animator.start();
    }

    public static void main(String[] args) {
        new Frame().setup();

    }

}
import java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入com.jogamp.opengl.GL2;
导入com.jogamp.opengl.GLEventListener;
导入com.jogamp.opengl.GLAutoDrawable;
导入com.jogamp.opengl.gl功能;
导入com.jogamp.opengl.GLProfile;
导入com.jogamp.opengl.awt.GLCanvas;
导入com.jogamp.opengl.glu.glu;
导入com.jogamp.opengl.util.FPSAnimator;
公共类框架实现了GLEventListener、KeyListener{
公开期末双pi2=(2*Math.PI);
私有GLU GLU=新GLU();
专用浮点数rtri=0.0f;
私有静态ArrayList stars=新ArrayList();
专用静态浮动zFloat=1.0f;
@凌驾
按下公共无效键(按键事件e){
if(e.getKeyChar()==KeyEvent.VK_UP){
rtri+=0.5f;
系统输出打印LN(rtri);
系统输出打印项次(“增加”);
}
else if(e.getKeyChar()==KeyEvent.VK_DOWN){
rtri-=0.5f;
系统输出打印LN(rtri);
系统输出打印项次(“减少”);
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
}
@凌驾
public void keyTyped(KeyEvent e){
}
@凌驾
公共空白显示(GLAutoDrawable){
最终GL2 gl=drawable.getGL().getGL2();
gl.glClear(GL2.gl_颜色_缓冲_位| GL2.gl_深度_缓冲_位);
gl.glLoadIdentity();//重置视图
gl.glTranslatef(0.0f,0.0f,-2.0f);//移动恒星平面
gl.glRotatef(rtri,0.0f,-2.0f,zFloat);//旋转平面
对于(int sNum=0;sNum如果(高度),则将关键侦听器添加到帧中。