使用修饰键

时间:2018-01-06 20:05:40

标签: intellij-idea intellij-plugin

我有一个行动小组,里面有很多动作。与按Ctrl + Shift + F10时显示的运行配置列表类似,我希望在用户选择操作时保持Shift时执行不同的操作(或操作的变体)。

可悲的是,documentationcode examples都无法帮助我。我也无法找到上述运行配置操作组的源代码。

当然,我已尝试过明显的解决方案:

  • 检查event.getModifiers()内的actionPerformed(ActionEvent)的值。
  • KeyListener添加到包含操作列表的弹出窗口中。

虽然第一个解决方案在菜单中单击时单击时有效,但在使用Shift + Enter选择它时它不起作用。事实上,我甚至无法捕捉任何关键事件,因为它们似乎被速度搜索所捕获。

如何根据修饰键更改操作组的行为?

1 个答案:

答案 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");
    }
});