如何在java中向Gui添加keylistener

如何在java中向Gui添加keylistener,java,swing,keylistener,Java,Swing,Keylistener,我有一个简单的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());

我有一个简单的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());
}
以及listner到keyevents的键类

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()),它会给出一个错误。 我做错了什么


谢谢

您需要先阅读教程。您不会使用
add(…)
添加KeyListener,而是使用
addKeyListener(…)
添加KeyListener,因为
add(…)
仅用于添加组件,但是,我甚至不会为此使用KeyListener,而是使用键绑定,这将有助于解决将来焦点阻止KeyListener工作时出现的问题


例如,使用我的小密钥绑定添加编译并运行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和键绑定的响应

但是,如果您在混音中添加一个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);
   }
}

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

您需要先阅读教程。您不会使用
add(…)
添加KeyListener,而是使用
addKeyListener(…)
添加KeyListener,因为
add(…)
仅用于添加组件,但是,我甚至不会为此使用KeyListener,而是使用键绑定,这将有助于解决将来焦点阻止KeyListener工作时出现的问题


例如,使用我的小密钥绑定添加编译并运行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和键绑定的响应

但是,如果您在混音中添加一个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);
   }
}

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

您需要使用
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);
    }
}

您需要使用
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);
    }
}

然后在混乱中添加一个按钮,会发生什么?它将失败,这就是为什么。更不用说如果/当代码工作时将抛出的异常了!代码确实可以工作,并且由于在实现的方法中抛出异常而抛出异常。我把它们放在里面了,因为它们包含在OP的来源中。也许他想在修复这个错误后实现这些。然后在混乱中添加一个JButton,接下来会发生什么?它将失败,这就是为什么。更不用说如果/当代码工作时将抛出的异常了!代码确实可以工作,并且由于在实现的方法中抛出异常而抛出异常。我把它们放在里面了,因为它们包含在OP的来源中。也许他想在修复这个错误后实现这些。