如何在java中向Gui添加keylistener
我有一个简单的Gui如何在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());
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的来源中。也许他想在修复这个错误后实现这些。