Java 键绑定(bind)不工作

标签 java swing input key-bindings onfocus

我正在尝试在 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)...

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

参见 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();
            }
        });
    }
}

关于Java 键绑定(bind)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17984912/

相关文章:

java - 我的自定义外观实现似乎不起作用

mysql - 如何使用数据库防止在 codeigniter 中插入某些冒犯性词语

java - 为什么强制转换为泛型才生效?

java - 使用 Javac 编译困难 - 问题

java - 如何在窗口监听器方法中调用 JFrame(类本身)?

c - 如何在C中正确输入字符串

jquery - 查找特定类的下一个输入字段

java - 如何在位掩码中使用有符号整数类型中的每一位?

java - Jsoup 删除引号和撇号

java - java.awt.graphics 中图形的自定义方法