2016-09-10 13 views
0

私はJavaとOpenGLを初めて使用しています。なぜ私のリスナーは聞こえませんか?

私はリスナーを持っていますが、なぜ動作していないのか理解しようとしていますか?私がキーを押すと、何も起こりません。私が参照しているリスナーは:

@Override 
public void keyTyped(KeyEvent e) 
{ 
    // TODO Auto-generated method stub 
    char key= e.getKeyChar(); 
    System.out.printf("Key typed: %c\n", key); 
} 

ここに私のファイルがあります。私は私のキーボードのキーを押したときに

HelloOpenGL.java

package helloOpenGL; 

/************************************************************************************* 
* IMPORTS  
**************************************************************************************/ 
import java.awt.BorderLayout; 
import java.awt.Frame; 
import com.jogamp.opengl.GLCapabilities; 
import com.jogamp.opengl.awt.GLCanvas; 
import com.jogamp.opengl.util.Animator; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 


/************************************************************************************* 
* Class HelloOpenGL 
**************************************************************************************/ 
public class HelloOpenGL extends Frame 
{ 
    // Animator? Unneeded?? 
    static Animator anim = null; 


    /************************************************************************************* 
    * setupJOGL 
    * 
    * Method that sets up Java openGL?? 
    **************************************************************************************/ 
    private void setupJOGL() 
    { 
     GLCapabilities caps = new GLCapabilities(null); 
     caps.setDoubleBuffered(true); 
     caps.setHardwareAccelerated(true); 

     GLCanvas canvas = new GLCanvas(caps); 
     add(canvas); 

     JoglEventListener jgl = new JoglEventListener(); 
     canvas.addGLEventListener(jgl); 
     canvas.addKeyListener(jgl); 




     //anim = new Animator(canvas); 
     //anim.start(); 

    } 

    /************************************************************************************* 
    * HelloOpenGL Constructor ? 
    **************************************************************************************/ 
    public HelloOpenGL() 
    { 
     super("test"); 

     setLayout(new BorderLayout()); 


     // To close window 
     addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent e) 
      { 
       System.exit(0); 
      } 
     }); 

     setSize(600, 600); 
     setLocation(40, 40); 

     setVisible(true); 

     // Call setupJOGL 
     setupJOGL(); 
    } 

    public static void main(String[] args) 
    { 
     // Instantiate object 
     HelloOpenGL demo = new HelloOpenGL(); 

     // Show it? 
     demo.setVisible(true); 
    } 
} 


class MyWin extends WindowAdapter 
{ 
    public void windowClosing(WindowEvent e) 
    { 
     System.exit(0); 
    } 
} 

JoglEventListener.java

package helloOpenGL; 

/************************************************************************************* 
* IMPORTS  
**************************************************************************************/ 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import com.jogamp.opengl.*; 
import com.jogamp.opengl.glu.GLU; 

/************************************************************************************* 
* JoglEventListener 
**************************************************************************************/ 
public class JoglEventListener implements GLEventListener, KeyListener 
{ 

    float[] vertices={5.97994f, -0.085086f, -0.010798f, 
      5.97994f, 10.0043f, -0.010798f, 
      7.99077f, 10.0043f, -0.010798f, 
      7.99077f, 11.3449f, -0.010798f, 
      -0.405339f, 11.3449f, -0.010798f, 
      -0.405339f, 9.98083f, -0.010798f, 
      1.65252f, 9.98083f, -0.010798f, 
      1.65252f, 0.549879f, -0.010798f, 
      -0.722839f, 0.549879f, -0.010798f, 
      -0.722839f, -1.69612f, -0.010798f, 
      2.6168f, -1.69612f, -0.010798f, 
      -7.24925f, 0.42055f, -0.010798f, 
      -9.35415f, 0.42055f, -0.010798f, 
      -9.35415f, 10.0043f, -0.010798f, 
      -7.37859f, 10.0043f, -0.010798f, 
      -7.37859f, 11.3802f, -0.010798f, 
      -15.8217f, 11.3802f, -0.010798f, 
      -15.8217f, 9.99258f, -0.010798f, 
      -13.8109f, 9.99258f, -0.010798f, 
      -13.8109f, -0.061591f, -0.010798f, 
      -10.2361f, -1.73139f, -0.010798f, 
      -7.26099f, -1.73139f, -0.010798f, 
      -6.1909f, 0.855631f, -0.010798f, 
      -8.11942f, 0.855631f, -0.010798f, 
      -8.11942f, 2.31379f, -0.010798f, 
      0.217914f, 2.31379f, -0.010798f, 
      0.217914f, 0.926204f, -0.010798f, 
      -1.73415f, 0.926204f, -0.010798f, 
      -1.73415f, -4.10675f, -0.010798f, 
      9.23724f, 0.937952f, -0.010798f, 
      7.26169f, 0.937952f, -0.010798f, 
      7.26169f, 2.38434f, -0.010798f, 
      15.6696f, 2.38434f, -0.010798f, 
      15.6696f, 1.00851f, -0.010798f, 
      14.964f, 1.00851f, -0.010798f, 
      7.75558f, -2.44873f, -0.010798f, 
      14.4231f, -9.36318f, -0.010798f, 
      16.0576f, -9.36318f, -0.010798f, 
      16.0576f, -10.6685f, -0.010798f, 
      7.62625f, -10.6685f, -0.010798f, 
      7.62625f, -9.33965f, -0.010798f, 
      9.67236f, -9.33965f, -0.010798f, 
      4.49827f, -3.90687f, -0.010798f, 
      -1.35784f, -6.59973f, -0.010798f, 
      -1.35784f, -9.3279f, -0.010798f, 
      0.217914f, -9.3279f, -0.010798f, 
      0.217914f, -10.6919f, -0.010798f, 
      -8.22526f, -10.6919f, -0.010798f, 
      -8.22526f, -9.32786f, -0.010798f, 
      -6.20266f, -9.32786f, -0.010798f}; 
    int[] indices={3, 2, 3, 1, 
      3, 1, 3, 6, 
      3, 1, 6, 10, 
      3, 10, 6, 7, 
      3, 10, 7, 8, 
      3, 4, 5, 6, 
      3, 4, 6, 3, 
      3, 10, 8, 9, 
      3, 1, 10, 0, 
      3, 13, 14, 15, 
      3, 13, 15, 18, 
      3, 13, 18, 20, 
      3, 13, 20, 12, 
      3, 16, 17, 18, 
      3, 16, 18, 15, 
      3, 12, 20, 21, 
      3, 12, 21, 11, 
      3, 20, 18, 19, 
      3, 49, 22, 44, 
      3, 44, 22, 28, 
      3, 44, 28, 43, 
      3, 43, 28, 29, 
      3, 43, 29, 42, 
      3, 42, 29, 35, 
      3, 42, 35, 41, 
      3, 41, 35, 36, 
      3, 41, 36, 38, 
      3, 38, 36, 37, 
      3, 39, 40, 41, 
      3, 39, 41, 38, 
      3, 29, 30, 32, 
      3, 29, 32, 34, 
      3, 29, 34, 35, 
      3, 46, 47, 49, 
      3, 46, 49, 44, 
      3, 46, 44, 45, 
      3, 22, 23, 25, 
      3, 22, 25, 27, 
      3, 22, 27, 28, 
      3, 25, 23, 24, 
      3, 27, 25, 26, 
      3, 49, 47, 48, 
      3, 32, 30, 31, 
      3, 34, 32, 33}; 
    float backrgb[] = new float[4]; 
    float rot; 

    // Instantiate GLU thing? 
    private GLU glu = new GLU(); 

    /************************************************************************************* 
    * displayChanged 
    * What does this do? 
    **************************************************************************************/ 
    public void displayChanged(GLAutoDrawable gLDrawable, 
       boolean modeChanged, boolean deviceChanged) 
    { 
     // Function that does nothing? 
    } 

    /** Called by the drawable immediately after the OpenGL context is 
    * initialized for the first time. Can be used to perform one-time OpenGL 
    * initialization such as setup of lights and display lists. 
    * @param gLDrawable The GLAutoDrawable object. 
    */ 

    /************************************************************************************* 
    * init  
    **************************************************************************************/ 
    public void init(GLAutoDrawable gLDrawable) 
    { 
     GL2 gl = gLDrawable.getGL().getGL2(); 
     //gl.glShadeModel(GL.GL_LINE_SMOOTH);    // Enable Smooth Shading 
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background 
     gl.glClearDepth(1.0f);      // Depth Buffer Setup 
     gl.glEnable(GL.GL_DEPTH_TEST);    // Enables Depth Testing 
     gl.glDepthFunc(GL.GL_LEQUAL);    // The Type Of Depth Testing To Do 
     // Really Nice Perspective Calculations 
     //gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); 
    } 


    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, 
       int height) 
    { 
     final GL2 gl = gLDrawable.getGL().getGL2(); 

     if (height <= 0) // avoid a divide by zero error! 
      height = 1; 
     final float h = (float) width/(float) height; 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL2.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     glu.gluPerspective(45.0f, h, 1.0, 200.0); 
     gl.glMatrixMode(GL2.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     gl.glTranslatef(0.0f, 0.0f, -40.0f); 
    } 

    @Override 
    public void display(GLAutoDrawable gLDrawable) 
    { 
     // TODO Auto-generated method stub 
     final GL2 gl = gLDrawable.getGL().getGL2(); 

     gl.glClearColor(backrgb[0], 0, 1, 1); 
     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

     backrgb[0]+=0.0005; 
     if (backrgb[0]> 1) backrgb[0] = 0; 

     // DRAW STUFF IN THIS FUNCTION 

    } 

    @Override 
    public void dispose(GLAutoDrawable arg0) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent e) 
    { 
     // TODO Auto-generated method stub 
     char key= e.getKeyChar(); 
     System.out.printf("Key typed: %c\n", key); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyReleased(KeyEvent e) 
    { 
     // TODO Auto-generated method stub 

    } 

     /* 
    public void init(GLDrawable gLDrawable) { 
     final GL gl = glDrawable.getGL(); 
     final GLU glu = glDrawable.getGLU(); 

     gl.glMatrixMode(GL.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     glu.gluOrtho2D(-1.0f, 1.0f, -1.0f, 1.0f); // drawing square 
     gl.glMatrixMode(GL.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    }*/ 

} 

基本的には、 "入力されたキーは、" 何らかの理由で出力されないさん、それはほとんどですあたかも聞いていないかのように。私のエラーはどこか些細なことだと確信していますが、どこにいるのか分かりません。

+0

良い質問をするには[mcve]を書く必要があり、問題を自分で特定するのに役立ちます。無関係なコード(例:OpenGLの描画コードのすべて)を取り除くことをお勧めします。 –

+1

ちょうどヒントとして、 'KeyListener'と' GLEventListener'実装のために別々のクラスを用意してみてください:それはあなたのロジックを分離し、問題を識別しやすくするのに役立ちます。 –

答えて

0

canvasにフォーカスがあることを確認して、そこで入力イベントが受信されるようにする必要があります。 GUI要素が入力イベントを受け取るコードの量からはわかりません。おそらく、リスナーをフレームや表示される他の要素に追加することもできます。または、フォーカスを明示的にcanvasに設定します(そして、それがそこに残っていることを確認してください)。

もちろん、JComponent.requestFocusAPI)とneeds to be called after the elements are displayedと呼ばれます。

+0

ありがとう、マーティン、私は単にcanvas.requestFocus();を置く必要がありました。 –

0

key listenerをフレーム(キャンバス)に追加する必要があります。私はこのようなものとして、Frameを拡張HelloOpenGLクラスを作ります:

public class HelloOpenGL extends Frame implements KeyListener{ 
    public HelloOpenGL(){ 
     addKeyListener(this); //this statement is missing from your code 
     setFocusable(true); 
     ... 
    } 
    ... 

    //Override KeyListener interface methods in this class 
} 

それも念頭に置いて、フレームを表しひとつですので、だから私はHelloOpenGLクラス自体の取り扱いキーイベントをどうなるのか@Andy Turnerと述べた。私はこの方法でプログラムを試しましたが、これは私の場合にはうまくいきます。

関連する問題