我对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操作。我们可以让这两个键击同时工作吗?
请指导。
答案 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的动作监听器。