How do I add a keystroke inside of keyPressed(KeyEvent e) method to change color of ball? simple KeyListener demo

StackOverflow https://stackoverflow.com/questions/23206807

  •  07-07-2023
  •  | 
  •  

Domanda

I have limited Java experience, especially when it relates to graphics. I've had very good help on this problem so far. It's starter code (below) which works fine as I tested it in Eclipse. I'm using it from a class to teach a high school student. As per the instructions below in comments, would someone know an easy way extend the already simple program to change the color of the Ball after pressing the button C? I'm thinking of adding the following code to the keyPressed(KeyEvent e) method:

else if(keyCode == KeyEvent.VK_C)    
{     
   //Not sure what code to add here 
   //g.setColor(Color.green);   ----> this line says "g can not be resolved". 
}

Any tips or ideas to keep the program simple would be very much appreciated. Thank you. .

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);
    }
}
È stato utile?

Soluzione

private Color currentColor;

...

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

    g.setColor(currrentColor);
    g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
}

...

public void keyPressed(KeyEvent e)                  
{
    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;
    }else currentColor = Color.BLUE;
    repaint();
}

You should probably do something like this.

Altri suggerimenti

You dont have the 'g ' graphics variable in the key press event so you get an un resolved variable error from compilor. Need to store the color to draw in a variable and use it in the paint method.

Have a class instance variable that is the color. Initially it will be

colorBall = Color.white

then on clicking C if its white make it green and vice versa.

In paint simply use the variable to color

  g.setColor(colorBall );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top