【问题标题】:Key bindings not working for JFrame键绑定不适用于 JFrame
【发布时间】:2015-07-06 15:23:08
【问题描述】:

我已经阅读了几个主题,展示了如何创建 KeyBinding,但是,没有一个主题完全适合我。我的 JFrame 有一个 JMenuBar,对于菜单项,NetBeans 正在正确生成代码,例如:

mniExit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));
    mniExit.setText(bundle.getString("Menu.File.Exit")); // NOI18N
    mniExit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mniExitActionPerformed(evt);
        }
    });
mnuFile.add(mniExit);

然而,当菜单被隐藏时,只有这个绑定是不可见的。我试过类似的东西:

getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(mniExit.getAccelerator(), "exit");
getRootPane().getActionMap().put("exit", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            mniExit.doClick();
        }
    });

但它根本不起作用。我做错了什么?

提前致谢!

【问题讨论】:

  • 如果您没有很快获得帮助,请考虑创建并发布minimal example program,您可以在其中创建运行、编译、不需要外部依赖项(图像、数据库)的最小程序,这表明您的问题对我们来说。

标签: java swing events action key-bindings


【解决方案1】:

你说

然而,当菜单被隐藏时,只有这个绑定是不可见的。我尝试过类似的方法:

我在这里猜测,但如果按钮或菜单不可见,我不确定是否可以单击它。为简化起见,我将创建一个 ExitAction 类,这是一个从 AbstractAction 扩展的类,它作为一个 Action 分配给任何需要它的 JMenuItem、JButton 或 Key Binding。如果它们都共享相同的 ExitAction 对象,则可以在需要时一次性禁用该操作(以及相应的菜单项和按钮)。

如果这没有帮助,请再次创建并发布minimal example program,您可以在其中创建运行、编译、不需要外部依赖项(图像、数据库)的最小程序,这向我们展示了您的问题。

【讨论】:

  • 感谢您的回答!问题不是对 doClick() 的调用,实际上,我刚刚发现这个问题只发生在 CTRL+X 击键上。所有其他绑定(CTRL+O、CTRL+N、CTRL+S、CTRL+SHIFT+S)都可以工作,即使项目被隐藏,但是 CTRL+X 不能。这种特定组合是否有可能在其他地方被捕获?
  • 您可能不应该将 Ctrl+X、Ctrl+C 或 Ctrl+V 用于菜单加速器,因为它们会与您应用中任何文本字段的剪切/复制/粘贴行为发生冲突。跨度>
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多