有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将击键Z添加到按键(KeyEvent e)以将球跳跃/重新绘制到新的随机位置?(使用了KeyListener演示。)

我的Java经验有限,尤其是在图形方面。到目前为止,我在这个问题上得到了很大的帮助。这是我在Eclipse中测试的启动代码(位于底部),运行良好。我用它来教一个高中生。根据下面注释中的说明,有人知道一种简单的方法来扩展已经很简单的程序,使球在按下Z按钮后跳跃/移动/重新绘制到一个随机的新位置吗?我正在考虑向按键(KeyEvent e)方法添加以下代码:

else if(keyCode == KeyEvent.VK_Z)    
{     
   //Not sure what to add here. Just want to change X and Y coordinates to 
   //anything, so long as the program works and stays fairly simple  
   //for now.
   //----> g.fillOval(x + radius, y + radius, 2 * radius, 2 * radius);   
   // this line above says "g can not be resolved". 
} 

如果您有任何建议或想法可以使程序简单,我们将不胜感激。谢谢大家!

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);
        }
    }

共 (2) 个答案

  1. # 1 楼答案

    无法解析g的原因是keyPressed()方法中不存在它g是方法paint()的一个参数。这意味着您只能在方法paint()中引用它。您可以在方法paint()之外声明另一个名为g的变量,但它不会是相同的g。它甚至不需要有相同的类型

    也就是说,你根本不需要直接引用g来解决你的问题。paint()方法已经可以处理绘制圆。你只需要改变圆圈的位置,并告诉应用程序重新绘制它。如果给xy分配新值,然后调用repaint(),圆圈将移动。注意repaint()已经在keyPressed()方法的末尾被调用

    下面是一个例子。用任何适合您的问题的代码替换equals右边的代码

    else if(keyCode == KeyEvent.VK_Z)    
    {     
       x = x + radius;
       y = y + radius;
    }
    

    如果你看看其他的If/else条款,你会发现这也是他们正在做的事情

  2. # 2 楼答案

    尝试这样做:

    public void keyPressed(KeyEvent e){
    if(e.getKeyCode == KeyEvent.VK_Z){
    
    moveRand();
    //Assuming that is the method for moving the ball randomly.
        }
    }
    

    然后

    public void moveRand(Graphics2D g){
    
    g.drawOval(Random.nextInt() / window.getWidth() + 1, Random.nextInt() / window.getHight() + 1, ballWidth, ballHight);
    
    
    }
    

    希望这有帮助