您需要先阅读教程。您不要使用 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);
}
}
然后按下按钮后会发生什么?告诉我哪个密钥处理例程有效?