可以为JMenuItem定义多个加速器吗?

时间:2009-12-22 12:55:36

标签: java swing

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

我的代码如下:

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操作。我们可以让这两个键击同时工作吗?

请指导。

3 个答案:

答案 0 :(得分:7)

是的,可以做到。在幕后,setAccelerator()只是创建一个Key Binding,但是你注意到第二个绑定替换了第一个。

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

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

答案 1 :(得分:3)

来自:http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTEvent.html

  

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

因此,您可以将两个键的掩码组合在一起,但不能组合KeyEvents。

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

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

答案 2 :(得分:0)

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

如果你想要多次击键,我认为你应该将keyListener添加到顶部框架(或面板,对话框......),它会调用添加到menuItem的动作监听器。