【问题标题】:Java Key Bindings Not WorkingJava 键绑定不起作用
【发布时间】:2013-08-01 03:45:05
【问题描述】:

我正在尝试在 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”。我已经多次尝试使用许多不同的变体、不同的键,并且我确保面板处于焦点位置,但没有运气。我究竟做错了什么?

【问题讨论】:

    标签: java swing input key-bindings onfocus


    【解决方案1】:

    问题在于您查找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)...
    

    会更安全...但您需要确定希望从哪个级别触发击键

    请参阅JComponentHow 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();
                }
            });
        }
    }
    

    【讨论】:

    • 没注意到你在使用'w',以为你在使用"w"。更新了工作示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多