java为游戏正确绑定密钥

java为游戏正确绑定密钥,java,swing,game-engine,key-bindings,Java,Swing,Game Engine,Key Bindings,当按下上、下、左、右键时,我试图上、下、左、右移动一个矩形。我很困惑,为什么游戏开始时,关键侦听器不再侦听..即gameloop启动时。在开始游戏或按下“开始”键之前,监听器会工作,即它会打印“上压”System.out.println(“上压”);但是当游戏通过点击开始按钮开始时,监听器就不再工作了。为什么会这样?谢谢你的帮助 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Game

当按下上、下、左、右键时,我试图上、下、左、右移动一个矩形。我很困惑,为什么游戏开始时,关键侦听器不再侦听..即gameloop启动时。在开始游戏或按下“开始”键之前,监听器会工作,即它会打印“上压”System.out.println(“上压”);但是当游戏通过点击开始按钮开始时,监听器就不再工作了。为什么会这样?谢谢你的帮助

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GameLoopTest extends JFrame implements ActionListener
{
   private GamePanel gamePanel = new GamePanel();
   private JButton startButton = new JButton("Start");
   private JButton quitButton = new JButton("Quit");
   private JButton pauseButton = new JButton("Pause");
   private boolean running = false;
   private boolean paused = false;
   private int fps = 60;
   private int frameCount = 0;

   public GameLoopTest()
   {
      super("Fixed Timestep Game Loop Test");
      Container cp = getContentPane();
      cp.setLayout(new BorderLayout());
      JPanel p = new JPanel();
      p.setLayout(new GridLayout(1,2));
      p.add(startButton);
      p.add(pauseButton);
      p.add(quitButton);
      cp.add(gamePanel, BorderLayout.CENTER);
      cp.add(p, BorderLayout.SOUTH);
      setSize(1000, 700);

      startButton.addActionListener(this);
      quitButton.addActionListener(this);
      pauseButton.addActionListener(this);



      Action handle_up_action_pressed = new AbstractAction(){

          public void actionPerformed(ActionEvent e){

              gamePanel.up_pressed= true;

              System.out.println("up pressed");


          }

      };


      Action handle_up_action_released = new AbstractAction(){

          public void actionPerformed(ActionEvent e){

            gamePanel.up_pressed= false;

          }

      };


      Action handle_down_action_pressed = new AbstractAction(){

          public void actionPerformed(ActionEvent e){


            gamePanel.down_pressed= true;

          }

      };


      Action handle_down_action_released = new AbstractAction(){

          public void actionPerformed(ActionEvent e){


            gamePanel.down_pressed= false;

          }

      };


      Action handle_left_action_pressed = new AbstractAction(){

          public void actionPerformed(ActionEvent e){


            gamePanel.left_pressed= true;

          }

      };


      Action handle_left_action_released = new AbstractAction(){

          public void actionPerformed(ActionEvent e){


            gamePanel.left_pressed= false;



          }

      };


      Action handle_right_action_pressed = new AbstractAction(){

          public void actionPerformed(ActionEvent e){


            gamePanel.right_pressed= true;


          }

      };


      Action handle_right_action_released = new AbstractAction(){

          public void actionPerformed(ActionEvent e){

            gamePanel.right_pressed= false;



          }

      };




      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "handle_up_pressed");
      gamePanel.getActionMap().put("handle_up_pressed", handle_up_action_pressed);

      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "handle_up_released");
      gamePanel.getActionMap().put("handle_up_released", handle_up_action_released);

      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "handle_down_pressed");
      gamePanel.getActionMap().put("handle_down_pressed", handle_down_action_pressed);

      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "handle_down_released");
      gamePanel.getActionMap().put("handle_down_released", handle_down_action_released);

      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "handle_left_pressed");
      gamePanel.getActionMap().put("handle_left_pressed", handle_left_action_pressed);

      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "handle_left_released");
      gamePanel.getActionMap().put("handle_left_released", handle_left_action_released);

      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "handle_right_pressed");
      gamePanel.getActionMap().put("handle_right_pressed", handle_right_action_pressed);

      gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "handle_right_released");
      gamePanel.getActionMap().put("handle_right_released", handle_right_action_released);














   }

   public static void main(String[] args)
   {
      GameLoopTest glt = new GameLoopTest();
      glt.setVisible(true);
   }

   public void actionPerformed(ActionEvent e)
   {
      Object s = e.getSource();
      if (s == startButton)
      {
         running = !running;
         if (running)
         {
            startButton.setText("Stop");
            runGameLoop();
         }
         else
         {
            startButton.setText("Start");
         }
      }
      else if (s == pauseButton)
      {
        paused = !paused;
         if (paused)
         {
            pauseButton.setText("Unpause");
         }
         else
         {
            pauseButton.setText("Pause");
         }
      }
      else if (s == quitButton)
      {
         System.exit(0);
      }
   }

   //Starts a new thread and runs the game loop in it.
   public void runGameLoop()
   {
      Thread loop = new Thread()
      {
         public void run()
         {
            gameLoop();
         }
      };
      loop.start();
   }

您正在侦听器上运行游戏,因此在游戏停止运行之前不会处理更多事件,并将焦点设置为JPanel,例如InputMap inMap=getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);谢谢mKorbel!JComponent.WHEN_IN_FOCUSED_WINDOW解决了这个问题。但是,为什么?默认的焦点设置是什么?@Darkhogg在监听器上运行游戏是什么意思?你能澄清一下吗?