0

I am new to Java and OpenGL.

I have a listener and I am trying to figure out why it isn't working? When I press a key absolutely nothing happens. The listener I'm referring to is:

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

Here are my files.

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();
    }*/

}

Basically "key typed" is never being outputted for some reason when I press keys on my keyboard, it's almost as if it isn't listening. I'm sure my error lies somewhere trivial but I'm not sure where it's at?

progyammer
  • 1,498
  • 3
  • 17
  • 29
  • Writing a [mcve] is necessary to ask a good question, and can help you to identify the problem yourself. Try taking away irrelevant code (e.g. all of the OpenGL drawing code) until you get minimal code that you think *should* work, but doesn't. – Andy Turner Sep 10 '16 at 06:59
  • 1
    Just as a tip, try having separate classes for your `KeyListener` and `GLEventListener` implementations: it will help to separate your logic, and make it easier to identify issues. – Andy Turner Sep 10 '16 at 07:01

2 Answers2

0

You need to make sure that canvas has focus so that input events are received there. I cannot tell from the amount of code which GUI element receives input events. Maybe add the listener to the frame and other elements that are displayed, too. Or set the focus explicitly to the canvas (and make sure it stays there).

The method to use is called JComponent.requestFocus (API) and needs to be called after the elements are displayed, of course.

Community
  • 1
  • 1
Martin Sugioarto
  • 340
  • 3
  • 15
0

The key listener has to be added to the Frame (canvas). I would make the HelloOpenGL class, which extends Frame, as something like this:

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
}

So I would do the key event handling in the HelloOpenGL class itself since it's the one which represents the Frame, also keeping in mind what @Andy Turner said. I tried a program in this manner and this is working fine in my case.

Community
  • 1
  • 1
progyammer
  • 1,498
  • 3
  • 17
  • 29