【问题标题】:Can multiple accelerators be defined for a JMenuItem?可以为 JMenuItem 定义多个加速器吗?
【发布时间】:2013-12-17 04:47:24
【问题描述】:

setAccelerator() 有问题。现在,我有适用于 Ctrl+X 进行 DELETE 操作的代码。对于相同的JMenuItem,我也想将加速器设置为 Shift+Delete。

我的代码如下:

JMenuItem item = new JMenuItem(menuText);
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_X, KeyEvent.CTRL_MASK));
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK));

但这仅适用于 Shift+Delete 操作。似乎它正在覆盖 Ctrl+X 操作。我们可以让这两个按键同时工作吗?

请指导。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    是的,它可以做到。在幕后 setAccelerator() 只是创建一个键绑定,但是正如您注意到的那样,第二个绑定替换了第一个。

    因此,您需要创建一个 Action(而不是 ActionListener)来将其添加到菜单项。阅读 How to Use Actions 上的 Swing 教程中的部分以获取更多信息。现在您已经创建了 Action,您可以通过手动创建 Key Binding 与另一个 KeyStroke 共享该 Action。您可以阅读 How to Use Key Bindings 上的 Swing 教程中的部分以获取详细说明。或者您可以阅读我在Key Bindings 上的博客,其中提供了一些简单的代码示例。

    第二个绑定不会显示在菜单项本身上。

    【讨论】:

      【解决方案2】:

      发件人:http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTEvent.html

      掩码还用于指定 AWTEventListener 应侦听的事件类型。

      所以你可以组合两个键的掩码,但不能组合键事件。

      item.setAccelerator( 
          KeyStroke.getKeyStroke(
             KeyEvent.VK_X, KeyEvent.CTRL_MASK + KeyEvent.SHIFT_MASK));
      

      一种解决方法是在中间捕获 KeyEvent(在您的组件触发它之后,但在您的侦听器对其采取行动之前)并检查它是否是两种组合之一。然后触发一个事件,您以编程方式同意在该事件上表示您想要的操作。

      【讨论】:

      • 这应该是 OR 而不是 PLUS:KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
      【解决方案3】:

      第二次调用确实覆盖了加速器。如果方法以 set 开头,则只有一个。如果方法以 add 开头,则可以有多个(例如对于多个侦听器)。

      如果您希望多次击键来执行相同的操作,我认为您应该在顶部框架(或面板、对话框...)中添加一个 keyListener,它会调用添加到 menuItem 的操作侦听器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多