java - 为什么一旦 run() 方法中的 if 语句为 true,我就不能再使用 keyPressed 了?

标签 java if-statement graphics keylistener keyevent

我正在尝试制作一种打砖 block 游戏,但是一旦我按下开始按钮(“starten”= true)。我无法再使用 keyPressed() 实用程序,但在按下开始按钮之前我可以使用 keyPressed() 实用程序。有人可以告诉我为什么我突然不能再使用 keyPressed() 实用程序并给我一个可能的解决方案吗?

import java.util.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class VGKernel extends JPanel implements KeyListener {

public Rectangle screen, ball, block; // The screen area and ball location/size.
public Rectangle bounds;  // The boundaries of the drawing area.
public JFrame frame; // A JFrame to put the graphics into.
public VGTimerTask vgTask; // The TimerTask that runs the game.
public boolean down, right, starten = false; // Direction of ball's travel.
public JButton start;

public VGKernel(){
    super();
    screen = new Rectangle(0, 0, 600, 400);
    ball   = new Rectangle(0, 0, 20, 20);
    block = new Rectangle(260, 350, 40, 10);
    bounds = new Rectangle(0, 0, 600, 400); // Give some starter values.
    frame = new JFrame("VGKernel");
    vgTask = new VGTimerTask();
    addKeyListener(this);
    setFocusable(true);
    start = new JButton("Start");
    start.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            starten = true;
        }
    });
    add(start);
}

class VGTimerTask extends TimerTask{
    public void run(){
        repaint();

        if(starten){
        moveBall();
        frame.repaint();
        }
    }
  }

// Now the instance methods:
  public void paintComponent(Graphics g){
    // Get the drawing area bounds for game logic.
    bounds = g.getClipBounds();
    // Clear the drawing area, then draw the ball.
    g.clearRect(screen.x, screen.y, screen.width, screen.height);
    g.fillRect(ball.x, ball.y, ball.width, ball.height);
    g.fillRect(block.x, block.y, block.width, block.height);
  }

  public void moveBall(){
  // Ball should really be its own class with this as a method.
    if (right) ball.x+=1; // If right is true, move ball right,
    else ball.x-=1;       // otherwise move left.
    if (down)  ball.y+=1; // Same for up/down.
    else ball.y-=1;
    if (ball.x > (bounds.width - ball.width)) // Detect edges and bounce.
      { right = false; ball.x = bounds.width -  ball.width; }
    if (ball.y > (bounds.height - ball.height))
      { down  = false; ball.y = bounds.height - ball.height;}
    if (ball.x == 0) { right = true; ball.x = 0; }
    if (ball.y == 0) { down  = true; ball.y = 0; }
  }

  public void keyPressed(KeyEvent evt) {
      if(evt.getKeyCode() == KeyEvent.VK_G && block.x > 0) {
          block.x -= 20;
      }

      if(evt.getKeyCode() == KeyEvent.VK_H && block.x < 540) {
          block.x += 20;
      }
  }

  public void keyTyped(KeyEvent evt){  }
  public void keyReleased(KeyEvent evt){ }

  public void startActionPerformed(java.awt.event.ActionEvent evt) {
      starten = true;
  }

  public static void main(String arg[]){
    java.util.Timer vgTimer = new java.util.Timer();  // Create a Timer.
    VGKernel panel = new VGKernel(); // Create and instance of our kernel.

    // Set the intial ball movement direction.
    panel.down = true;
    panel.right = true;

    // Set up our JFRame
    panel.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    panel.frame.setSize(panel.screen.width, panel.screen.height);
    panel.frame.setContentPane(panel); 
    panel.frame.setVisible(true);

    // Set up a timer to do the vgTask regularly.
    vgTimer.schedule(panel.vgTask, 0, 10);
  }

}

最佳答案

您需要确保您正在监听 KeyEvents 的任何组件都具有焦点。

单击该按钮后,该按钮将取代您的 JPanel 获得焦点。更多信息请点击:http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html

您可以在 JPanel 上使用 requestFocusInWindow() 方法,也可以在 JButton 上调用 setFocusable(false)。

或者您可以使用键绑定(bind)来代替:http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

关于java - 为什么一旦 run() 方法中的 if 语句为 true,我就不能再使用 keyPressed 了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970148/

相关文章:

java - 使用 JFileChooser 获取目录中的所有文件名?

java - 小程序参数不保留 CRLF

objective-c - 在 NS_OPTIONS 中测试多个标志或条件

c++ - 如何拦截透明窗口的鼠标事件?

opengl - 如何知道顶点何时逆时针旋转

java - Hibernate 多对多映射和 cascade=delete

java - 我的 JButton 操作监听器不工作

java - 大括号缺少返回语句?

java - 制作密码 key validator ,其中一个输出应显示 : Reports ALL The Rules That The Key Failed

math - 将矩形变成圆环