0

I have limited Java experience and am using the program below to teach a high school level student introductory Java. Most programs from the class should work as is before extending it, like the program below. I am able to get the program running in Eclipse and drawing a Blue ball like it states in the code. BUT, I can not get the ball to move up, down, left, or right. Was something left out of this 'starter' code that draws the ball, but does not respond to the arrow keys? It's as if all my keyPressed() code is ignored. Any insights are much appreciated.

.

import java.awt.*;
import java.awt.event.*;                            // #1
import javax.swing.*;   

/******************************************************************************
 * 
 * KeyListenerDemo.java
 * Demonstrates getting keyboard input using the KeyListener interface.
 * 
 * Program 18: Extend this program by adding a few more keystroke commands:
 *      z     (VK_Z)    - Cause the ball to jump to a random new location.
 *      s     (VK_S)    - Make the ball smaller - multiply its diameter 1/2.
 *      b     (VK_B)    - Make the ball bigger - multiply its diameter by 2.
 *      c     (VK_C)    - Change the color (in any way you'd like).
 *
 *  In addition, modify the program to ensure the following:
 *  - The ball goes all the way to the edge of the screen but stays
 *          completely on the screen. 
 *  - If a doubled diameter doesn't fit, make it as large as possible.
 *  - Be sure the ball never completely disappears.
 * 
 *****************************************************************************/
public class KeyListenerDemo extends JFrame
                        implements KeyListener      // #2
{
// Class Scope Finals
private static final int SCREEN_WIDTH = 1000;
private static final int SCREEN_HEIGHT = 800;
private static final int START_RADIUS = 25;
private static final int START_X = 100;
private static final int START_Y = 100;
private static final int STEP_SIZE = 10;

// Class Scope Variables
private static int x = START_X;             // x at center of the ball
private static int y = START_Y;             // y at center of the ball
private static int radius = START_RADIUS;   // radius of the ball

// Methods
/**
 * Create the window and register this as a KeyListener
 * 
 * @param args
 */
public static void main (String[] args)
{
    // Set up the JFrame window.
    KeyListenerDemo gp = new KeyListenerDemo();
    gp.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    gp.setVisible(true);

    gp.addKeyListener(gp);                          // #3
    // If this class had a constructor and you moved this line into
    //   that constructor it could not refer to gp since that variable
    //   is local to this method.  Instead you would write::
    // addKeyListener(this);
}

/**
 * Called when a key is first pressed
 * Required for any KeyListener
 * 
 * @param e     Contains info about the key pressed
 */
public void keyPressed(KeyEvent e)                  // #4A
{
    int keyCode = e.getKeyCode();
    if (keyCode == KeyEvent.VK_LEFT)
    {
        x = x - STEP_SIZE;
    }
    else if (keyCode == KeyEvent.VK_RIGHT)
    {
        x = x + STEP_SIZE;
    }
    else if (keyCode == KeyEvent.VK_UP)
    {
        y = y - STEP_SIZE;
    }
    else if (keyCode == KeyEvent.VK_DOWN)
    {
        y = y + STEP_SIZE;
    }
    repaint();
}

/**
 * Called when typing of a key is completed
 * Required for any KeyListener
 * 
 * @param e     Contains info about the key typed
 */
public void keyTyped(KeyEvent e)                    // #4B
{
}

/**
 * Called when a key is released
 * Required for any KeyListener
 * 
 * @param e     Contains info about the key released
 */
public void keyReleased(KeyEvent e)                 // #4C
{
}

/**
 * paint - draw the figure
 * 
 * @param g     Graphics object to draw in
 */


   public void paint(Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

        g.setColor(Color.blue);
        g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
    }
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • Possible duplicate of http://stackoverflow.com/questions/286727/java-keylistener-for-jframe-is-being-unresponsive – cybersam Apr 21 '14 at 21:07
  • I'm running the program, he is getting the keyPressed function firing but the `e.getKeyCode()` does not match the int returned from the `KeyEvent` – DoubleDouble Apr 21 '14 at 21:12
  • 1
    How embarrassing, I've been trying to use wasd. Of course that wouldn't work.. The above code works fine for me when I actually use the arrow keys. If it still isn't working for OP I would say to make sure to clean your project / rebuild it. – DoubleDouble Apr 21 '14 at 21:24
  • The above code works fine now. I made a big mistake and forgot the line gp.addKeyListener(gp); in the code version I have in my editor. – user3479410 Apr 21 '14 at 21:30
  • Thank you for all your advice. My KeyEvents respond fine now. Does anyone know a simple way to change the color of the ball if I type C? Could it be something like: else if(keyCode == KeyEvent.VK_C) { g.setColor(Color.green); } ? I need to change the color and get the editor saying "g can not be resolved". Any help appreciated as always. – user3479410 Apr 21 '14 at 21:39

0 Answers0