我有一个行动小组,里面有很多动作。与按Ctrl + Shift + F10
时显示的运行配置列表类似,我希望在用户选择操作时保持Shift
时执行不同的操作(或操作的变体)。
可悲的是,documentation和code examples都无法帮助我。我也无法找到上述运行配置操作组的源代码。
当然,我已尝试过明显的解决方案:
event.getModifiers()
内的actionPerformed(ActionEvent)
的值。KeyListener
添加到包含操作列表的弹出窗口中。虽然第一个解决方案在菜单中单击时单击时有效,但在使用Shift + Enter
选择它时它不起作用。事实上,我甚至无法捕捉任何关键事件,因为它们似乎被速度搜索所捕获。
如何根据修饰键更改操作组的行为?
答案 0 :(得分:1)
感谢Meo我找到了答案。
我有以下代码来创建一个包含操作列表的弹出窗口:
final ListPopup popup = JBPopupFactory.getInstance()
.createActionGroupPopup(...); // some parameters here
通过将该代码更改为以下内容,按Shift + Enter
将选择当前突出显示的选项,并将正确的修饰符传递给操作的actionPerformed
方法:
final ListPopupImpl popup = (ListPopupImpl) JBPopupFactory.getInstance()
.createActionGroupPopup(...); // some parameters here
popup.registerAction("invokeAction", KeyStroke.getKeyStroke("shift ENTER"),
new AbstractAction() {
@Override
public void actionPerformed(final ActionEvent event) {
final KeyEvent keyEvent
= new KeyEvent(popup.getComponent(), event.getID(),
event.getWhen(), event.getModifiers(),
KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED,
KeyEvent.KEY_LOCATION_UNKNOWN);
popup.handleSelect(true, keyEvent);
}
});
此外,根据是否持有密钥更改菜单标题:
popup.registerAction("shiftReleased", KeyStroke.getKeyStroke("released SHIFT"), new AbstractAction() {
public void actionPerformed(final ActionEvent event) {
popup.setCaption("Normal title");
}
});
popup.registerAction("shiftPressed", KeyStroke.getKeyStroke("shift pressed SHIFT"), new AbstractAction() {
public void actionPerformed(final ActionEvent event) {
popup.setCaption("Shift is pressed title");
}
});