我正在尝试在 JPanel 上使用 Java 进行键绑定(bind)。当我按下“w”按钮时,我想要执行某个 Action 。我按照 Java 教程进行绑定(bind),但 actionPerformed 方法没有执行(即没有文本打印出来)。以下是我的测试 GUI 的全部代码,突出显示了相关部分:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
@SuppressWarnings("serial")
public class Test extends JFrame{
private JPanel panel;
public Test(){
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,500);
setLayout(new BorderLayout());
setVisible(true);
panel = new JPanel();
// HERE ARE THE KEY BINDINGS
panel.getInputMap().put(KeyStroke.getKeyStroke('w'),"forward");
panel.getActionMap().put("forward", new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e){
System.out.println("test");
}
});
// END OF KEY BINDINGS
add(panel, BorderLayout.CENTER);
}
public static void main(String[] args){
new Test();
}
}
永远不会打印文本“test”。我已经尝试过很多次不同的变体、不同的键,并且我确保面板在焦点上,但没有运气。我究竟做错了什么?
最佳答案
问题在于您查找 KeyStroke
的方式。 KeyStroke.getKeyStroke('w')
将返回 typed w
,出于某种原因,它不会触发按键事件。这就是为什么我倾向于避免使用这种方法。而是使用
panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward");
或
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward");
此外,您可能希望为 InputMap
定义焦点约束,例如
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)...
会更安全...但是您需要决定您希望从哪个级别触发击键
参见 JComponent
和 How to use Key Bindings了解更多详情
更新了例子
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test extends JFrame {
private JPanel panel;
public Test() {
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);
setLayout(new BorderLayout());
setVisible(true);
panel = new JPanel();
// HERE ARE THE KEY BINDINGS
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward");
panel.getActionMap().put("forward", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("test");
}
});
// END OF KEY BINDINGS
add(panel, BorderLayout.CENTER);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
new Test();
}
});
}
}
关于Java 键绑定(bind)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17984912/