addKeylistener()不起作用

时间:2014-11-30 00:49:37

标签: java swing keylistener

对于学校,我必须做一个基于突围的小游戏。

我得到了我的JFrame:

game.setFocusable(true);
setContentpane(game);

在我的游戏中我添加了一个扩展Keylistener并实现JPanel的输入处理程序。

setFocusable(true);
Inputhandler input = new Inputhandler();
addKeylistener(input);

它似乎不起作用,我已经编写了很多测试,但我无法看到输入句柄捕获任何keyPressed。

当我将JFrame更改为:

add(game);

它的工作方式就像工作一样,但我这样做时遇到的问题是以正确的方式绘制我的面板。我有点坚持这个问题所以请有人帮助我。

我现在已达到目标:

public Game(){
    setFocusable(true);
    requestFocus();
    requestFocusInWindow();

    getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
    getActionMap().put("pressed", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Space is pressed");
        }
    });

    this.inputHandler = new InputHandler();
    addKeyListener(this.inputHandler);

    setPreferredSize(new Dimension(500,500));
}

1 个答案:

答案 0 :(得分:4)

如果我每次问这个问题都有一美元,我就退休了。按照以前的类似问题......

  • 是的,您需要使JPanel可以使其KeyListener可以正常工作
  • 你也必须把注意力放在焦点上,因为专注是不够的。通常这是通过在听取JPanel上调用requestFocusInWindow()来实现的。
  • 如果KeyListener要继续运作,那么没有其他任何东西可以成为焦点或窃取焦点。
  • 这是我们大多数人建议反对使用KeyListeners进行Swing应用程序的几个原因之一
  • 通常赞成使用Key Bindings

修改

我已经使用了您的代码,它的工作原理,包括键绑定和KeyListener:

import java.awt.Dimension;
import java.awt.event.*;

import javax.swing.*;

public class Game extends JPanel {
   private InputHandler inputHandler;

   public Game() {
      setFocusable(true);
      requestFocus();
      requestFocusInWindow();
      getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
      getActionMap().put("pressed", new AbstractAction() {
         @Override
         public void actionPerformed(ActionEvent e) {
            System.out.println("Space is pressed");
         }
      });
      this.inputHandler = new InputHandler();
      addKeyListener(this.inputHandler);
      setPreferredSize(new Dimension(500, 500));
   }

   class InputHandler extends KeyAdapter {
      @Override
      public void keyPressed(KeyEvent e) {
         System.out.println("key pressed");
      }

      @Override
      public void keyReleased(KeyEvent e) {
         System.out.println("key released");
      }
   }

   private static void createAndShowGui() {
      Game mainPanel = new Game();

      JFrame frame = new JFrame("Game");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}