【问题标题】:How can i add a keylistener to my Gui in java如何在 java 中向我的 Gui 添加 keylistener
【发布时间】:2013-12-06 00:49:40
【问题描述】:

我有一个简单的 Gui

public Gui(){
    ablak = new JFrame("Snake game");
    ablak.setVisible(true);
    ablak.setSize(new Dimension(600,600));
    ablak.setFocusable(true);
    ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ablak.add(new Grid());
    ablak.add(new Key());
}

还有一个关键类来监听关键事件

package snake;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Key implements KeyListener {

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_UP){
            System.out.println("Hi");
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }


}

如您所见,按向上箭头键应该会说类似 Hi,但没有任何反应。 如果我尝试在 Gui 类中添加(new Key()),则会出现错误。 我做错了什么?

谢谢

【问题讨论】:

    标签: java swing keylistener


    【解决方案1】:

    你需要使用addKeyListener()方法:

    public class Test2 {
        public static void main(String[] args) {
            JFrame ablak = new JFrame("Snake game");
            ablak.setVisible(true);
            ablak.setSize(new Dimension(600,600));
            ablak.setFocusable(true);
            ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            ablak.addKeyListener(new KeyListener(){
                 @Override
                    public void keyPressed(KeyEvent e) {
                        if(e.getKeyCode() == KeyEvent.VK_UP){
                            System.out.println("Hi");
                        }
                    }
    
                    @Override
                    public void keyTyped(KeyEvent e) {
                        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                    }
    
                    @Override
                    public void keyReleased(KeyEvent e) {
                        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                    }
            });
            ablak.setVisible(true);
        }
    }
    

    【讨论】:

    • 然后在混乱中添加一个JButton,会发生什么?它会失败,就是这样。
    • 更不用说如果/当该代码有效时将引发的异常!
    • 代码确实有效,并且由于它们在实现的方法中被抛出而抛出异常。我把这些留在了,因为它们包含在 OP 的源代码中。也许他想在修复此错误后实现这些。
    【解决方案2】:

    您需要先阅读教程。您不要使用 add(...) 添加 KeyListeners 而是使用 addKeyListener(...) 因为 add(...) 仅用于添加 component ,但话虽如此,我什至不会为此使用 KeyListener 而是当焦点阻止您的 KeyListener 工作时,键绑定将有助于解决您将来会遇到的问题。

    Key Bindings tutorial Link


    例如,用我的小键绑定添加编译和运行 Kevin Bowersox 的程序:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Test2 {
       public static void main(String[] args) {
          JFrame ablak = new JFrame("Snake game");
          ablak.setVisible(true);
          ablak.setSize(new Dimension(600, 600));
          ablak.setFocusable(true);
          ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          ablak.addKeyListener(new KeyAdapter() {
             @Override
             public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_UP) {
                   System.out.println("Hi from KeyListener");
                }
             }
          });
          ablak.setVisible(true);
    
          JPanel contentPane = (JPanel) ablak.getContentPane();
          int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
          InputMap inputMap = contentPane.getInputMap(condition);
          ActionMap actionMap = contentPane.getActionMap();
    
          String down = "down";
          inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), down);
          actionMap.put(down, new AbstractAction() {
    
             @Override
             public void actionPerformed(ActionEvent arg0) {
                System.out.println("Hi from Key Binding");
             }
          });
    
       }
    }
    

    如果您运行它并按下向上和向下箭头,您将看到来自功能正常的 KeyListener 和 Key Bindings 的响应。

    但是如果你像这样添加一个 JButton 会怎样:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Test2 {
       public static void main(String[] args) {
          JFrame ablak = new JFrame("Snake game");
          ablak.setVisible(true);
          ablak.setSize(new Dimension(600, 600));
          ablak.setFocusable(true);
          ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          ablak.addKeyListener(new KeyAdapter() {
             @Override
             public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_UP) {
                   System.out.println("Hi from KeyListener");
                }
             }
          });
    
          JPanel contentPane = (JPanel) ablak.getContentPane();
          int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
          InputMap inputMap = contentPane.getInputMap(condition);
          ActionMap actionMap = contentPane.getActionMap();
    
          String down = "down";
          inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), down);
          actionMap.put(down, new AbstractAction() {
    
             @Override
             public void actionPerformed(ActionEvent arg0) {
                System.out.println("Hi from Key Binding");
             }
          });
    
          JButton fooButton = new JButton("Foo");
          contentPane.setLayout(new FlowLayout());
          contentPane.add(fooButton);
    
          ablak.setVisible(true);
       }
    }
    

    然后按下按钮后会发生什么?告诉我哪个密钥处理例程有效?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2012-03-13
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 2021-07-07
      相关资源
      最近更新 更多