【问题标题】:Java KeyBindings not reacting on JPanelJava KeyBindings 对 JPanel 没有反应
【发布时间】:2023-03-27 15:40:01
【问题描述】:

我以前使用过 Java 的 KeyListener,但随着我的程序要求更多,我得到了切换到 KeyBinds 的建议。

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

在方法调用中,我将操作设置为 Print "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);
                }

    });

}

我做错了什么?谢谢!

【问题讨论】:

  • 可以在评论中发布您的完整代码。巴斯宾?
  • 我尝试将键绑定添加到不起作用的 JFrame - 对于全局级别绑定,您将键绑定添加到框架的根窗格。使用 JFrame 的getRootPane() 方法。
  • 那我做[Frame Name].getRootPane()?因为这不起作用...

标签: java swing key-bindings jcomponent


【解决方案1】:

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

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

应该是:

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

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

它也应该在您创建窗口的任何地方创建,以便也可以删除此行:

JPanel Panel = new JPanel();

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

您的类没有理由扩展 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 通常是您将用作主应用程序窗口的容器。

希望对你有帮助。

【讨论】:

  • 这帮助很大!谢谢你。该代码实际上仍然可以编译:)。无论如何,为什么让类扩展 JPanel 会很糟糕?另外,我们不能在 JFrame 和其他顶级容器上使用键绑定?
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 2012-12-09
  • 2016-02-26
  • 2017-05-09
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多