【问题标题】:addKeylistener() not workingaddKeylistener() 不起作用
【发布时间】:2014-11-30 00:49:37
【问题描述】:

为了学校,我必须制作一个基于 Breakout 的小游戏。

我得到了我的 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));
}

【问题讨论】:

    标签: java swing keylistener


    【解决方案1】:

    如果我每次被问到这个问题时都能得到一美元,那我就会有钱退休了。根据之前的类似问题...

    • 是的,您需要使 JPanel 成为焦点,它的 KeyListener 才能工作
    • 而且你还必须给它焦点,因为只有焦点是不够的。通常这是通过在监听的 JPanel 上调用 requestFocusInWindow() 来实现的。
    • 如果 KeyListener 要继续运行,其他任何东西都无法获得焦点或窃取焦点。
    • 这是我们大多数人反对在 Swing 应用程序中使用 KeyListener 的几个原因之一
    • 而且通常赞成使用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();
             }
          });
       }
    }
    

    【讨论】:

    • 我不会问搜索是否会给我任何适合我的情况的答案。我会检查你给我的每一个条件是否满足,我会向你汇报。
    • "I wouldn't be asking if the search would've given me any answer that would suffice for my case." 您的问题没有提及您的键绑定尝试。而且您可能永远不会找到特定于您的确切案例的答案或教程,但您可能会找到通常适用于您的部分问题的答案,然后由您从源头综合解决方案。
    • 我没有使用键绑定。我只是将它添加到 Keylistener 的 Keypressed 中:System.out.println("Key is press);
    • @GianiNoyez:我建议您实际上考虑使用键绑定。如果您在类似问题上对该站点进行了大量搜索,您可能会看到此建议。请注意,为了获得更好和更完整的帮助,请考虑创建并发布 minimal example program,这是一个小而完整的程序,只有必要的代码来演示您的问题,我们可以复制、粘贴、编译和运行而无需修改。
    • @GianiNoyez:你发布的代码和我发布的代码有很大的不同。任何人都可以在未经修改的情况下运行和测试我的代码,看看它是否正确。你的也不能这样说,因为它还不符合mcve 标准。同样,让我们​​了解您的代码为何无法运行的最佳方式是,您发布一个向我们展示的小示例程序。请注意,我的代码您的代码,只是它运行正确,因此我只能假设您的代码中存在尚未显示的错误。
    猜你喜欢
    • 2012-01-19
    • 2012-01-07
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多