[英]Java Key Bindings Not Working
我正在嘗試在JPanel上的Java中進行鍵綁定。 我希望在按下“ w”按鈕時執行某些操作。 我遵循Java教程進行綁定,但是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
和如何使用鍵綁定 。
更新了示例
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();
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.