Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 能否为一个项目定义多个加速器?_Java_Swing - Fatal编程技术网

Java 能否为一个项目定义多个加速器?

Java 能否为一个项目定义多个加速器?,java,swing,Java,Swing,setAccelerator()有问题。现在,我有了用于Ctrl+X删除操作的代码。对于相同的JMenuItem,我想将加速器设置为Shift+Delete 我的代码如下: JMenuItem item = new JMenuItem(menuText); item.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_X, KeyEvent.CTRL_MASK)); item.setAccelerator(KeyStroke.getKey

setAccelerator()
有问题。现在,我有了用于Ctrl+X删除操作的代码。对于相同的
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操作。我们能让这两个按键同时工作吗

请引导。

来自:

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

因此,可以组合两个关键点的掩码,但不能组合KeyEvents

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

一个解决办法是在中间捕获密钥事件(在你的组件启动之后,但是在你的监听器启动之前),检查它是否是两个组合中的一个。然后触发一个事件,在该事件上,您以编程方式同意表示所需的操作。

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


如果您想让多个按键执行相同的操作,我认为您应该在顶部框架(或面板、对话框等)中添加一个keyListener,该框架调用添加到菜单项的操作侦听器。

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

因此,您需要创建一个操作(而不是ActionListener)来将添加到菜单项中。有关更多信息,请阅读上的Swing教程部分。现在您已经创建了操作,您可以通过手动创建键绑定与另一个击键共享该操作。您可以阅读上的Swing教程中的部分以获得详细的解释。或者你可以阅读我的博客,在上面给出一些简单的代码示例


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

应该是或而不是加号:
KeyEvent.CTRL\u MASK\KeyEvent.SHIFT\u MASK