Java KeyBindings 对 JPanel 没有反应

标签 java swing key-bindings jcomponent

我以前使用过 Java 的 KeyListener,但由于我的程序要求更多,我收到建议切换到 KeyBinds。

首先,我尝试向 JFrame 添加键绑定(bind),但这不起作用(我不明白我需要使用什么 JComponent。)。因此,我尝试将程序移至 JPanel,然后将其添加到 JFrame,但是当按下所需按钮时,按键绑定(bind)不会使用react(在本例中为“1”按钮);

在方法调用中,我已将操作设置为打印“Hi”。这是代码:

public class Panel extends javax.swing.JPanel {
JPanel Panel = new JPanel();
/**
 * Creates new form Panel
 */
public Panel() {
      addKeyBinding(Panel, KeyEvent.VK_1, "1Button", (evt)->{
          System.out.println("Hi");
    });
    initComponents();
}

...... 这是方法 ......

public static void addKeyBinding(JComponent comp, int keyCode, String id, ActionListener actionListener){

    InputMap im = comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap ap = comp.getActionMap();

    im.put(KeyStroke.getKeyStroke(keyCode, 0, false),
        id);

        ap.put(id, new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    actionListener.actionPerformed(e);
                }

    });

}

我做错了什么?谢谢!

最佳答案

按键绑定(bind)适用于您的表单面板,对吧?我认为您误解了有关类和对象的一些概念。如果没有看到完整的代码,也很难提供帮助。但您的错误很可能是由这一行引起的:

addKeyBinding(Panel, KeyEvent.VK_1, "1Button", ...

应该是:

addKeyBinding(this, KeyEvent.VK_1, "1Button", ...

变量Panel应替换为关键字this,从而引用实际的表单面板。

它也应该在您创建窗口的任何位置创建,因此也可以删除此行:

JPanel Panel = new JPanel();

您的代码有很多问题。我无法想象第一个片段中的代码甚至可以编译。您正在尝试将变量命名为与类名相同的名称。

您的类没有理由扩展 JPanel,因为它不是新类型的 JPanel。只需删除您的扩展即可。然后将第一行更改为:

JPanel panel = new JPanel();

然后将小写面板传递给 addKeyBinding 方法。

如果出于某种奇怪的原因,您想让您的类扩展 JPanel,则将 this 作为第一个参数传递给 addKeyBinding,如/u/tiiv 所说,并删除 JPanel Panel = new JPanel 行,因为不需要它(正如您现在编写的那样,您的类 JPanel)。

至于使用哪个组件,JFrame 是顶级容器,因此通常是您的主应用程序窗口。然后将 JPanel 和其他组件放入 JFrame 中。 swing 中实际上有 4 个顶级容器(JFrame、JWindow、JDialog 和 JApplet),但 JFrame 通常是您将用作主应用程序窗口的容器。

希望对您有所帮助。

关于Java KeyBindings 对 JPanel 没有反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56021837/

相关文章:

macos - 无法在 Terminal.app OSX 上使用 Ctrl+A 和 Ctrl+E(bash 键绑定(bind))

java - 尝试附加一行文本时窗口出现 "see-through"- Java

java - Hibernate 一对多映射正在尝试将映射列更新为空

java - Spring MVC 将参数绑定(bind)到支持对象

java - Apache HttpClient 中的不可读字符

Java 查找我单击的图像?

java - 将文本框的标签放置在文本框上方而不是侧面

java用于多个文件下载的进度条

java - 任何更改 JTable 组件默认行为的方法

emacs - 如何设置键绑定(bind)以使 Emacs 像我想要的那样透明/不透明?