当前位置: 首页 > 面试题库 >

Java键绑定无效

璩无尘
2023-03-14
问题内容

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


问题答案:

问题是您查找的方式KeyStrokeKeyStroke.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();
            }
        });
    }
}


 类似资料:
  • 问题内容: 我需要绑定所有箭头键以执行相同的功能,但是每次获取按下哪个键时。目前我只有通过以下方式按下向右箭头键时才有 但是我需要这样的东西 问题答案: 您要问的实际上是违反直觉的,并且违背了键绑定API的设计。 目的是为每个按键提供单个工作单元。在我看来,这建议您应为每个箭头键分别执行操作。 它使您更容易遵循逻辑,进行更改,根据需要规避操作。 但是我是谁呢? 如果看不到它,一种简单的方法就是为每

  • 问题内容: 我试图写一个计算器,有一个问题。我已经为所有按钮制作了动作监听器,现在我希望可以从键盘输入数据。我是否需要对KeyListener或Keybinding进行全部操作,还是有其他方法可以使单击按钮后将其发送到actionlistener中的说明?还有更好的方法:Keylistener或Keybinding 问题答案: 一般而言,在您的键输入集有限的情况下,键绑定是一个更好的选择。 遭受与

  • 问题内容: 我想在我的应用程序中的任何位置(Control + S)触发保存操作。我已经添加了必要的键绑定,并且该操作将按预期触发。但是,如果我在JTable上尝试Control + S,则该表将启动我的自定义操作并激活该表单元格以进行编辑。我想我已经在表格的输入映射中禁用了编辑操作。我在这里想念什么? 问题答案: 像@Guillaume一样,我运行您的代码没问题。您可能会在这里讨论过无意中失败的

  • 问题内容: 我是Java图形和线程的新手,我正在尝试制作一个游戏(特别是Pong)。这个想法是两个人可以在同一个键盘上玩(即,有两个通过不同键控制的拨盘)。目前,两个玩家都无法同时移动其球拍。 有针对这个的解决方法吗?单独的线程是答案吗? 如果可能的话,我希望这些拨片能够同时(至少在表面上)移动。 更新:似乎使用存储按下的键是最好的选择。我已经做到了(并且可以正常工作),但是我想知道是否其中的任何

  • 问题内容: 我一直在运行这样的小脚本 但是,在我的情况下无法处理键盘事件(我在窗口7上使用python 2.7) 如果我用 一切正常。 所以,这真的使我感到困惑。请任何人告诉我为什么会这样,谢谢。 问题答案: 仅当具有键盘焦点的小部件获得按键事件时,按键绑定才会触发。默认情况下,画布 不会 获得键盘焦点。您可以使用该方法使其重点突出。通常,您可以在鼠标按钮上进行绑定。 将以下绑定添加到您的代码中,

  • 按键绑定 你可以激活keyBindings选项来支持键盘控制。默认情况下iScroll监听方向键,上下翻页建,home/end键,但这些按键绑定完全可以自定义。 你可以通过传递一个包含按键代码列表的对象来进行按键绑定。 默认的按键值如下: keyBindings: { pageUp: 33, pageDown: 34, end: 35, home: 36,