Intellij idea 使用修改器键更改动作组

Intellij idea 使用修改器键更改动作组,intellij-idea,intellij-plugin,Intellij Idea,Intellij Plugin,我有一个行动小组,里面有很多行动。与按下Ctrl+Shift+F10时显示的运行配置列表类似,我希望当用户在选择操作时按住Shift时执行不同的操作(或操作的变体) 可悲的是,他们两人都帮不了我多少忙。我也找不到上述运行配置操作组的源代码 当然,我尝试过显而易见的解决方案: 检查actionPerformed(ActionEvent)内部event.getModifiers()的值 在包含操作列表的弹出窗口中添加一个KeyListener 当在菜单中单击操作时,第一个解决方案起作用,但当使用

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

可悲的是,他们两人都帮不了我多少忙。我也找不到上述运行配置操作组的源代码

当然,我尝试过显而易见的解决方案:

  • 检查
    actionPerformed(ActionEvent)
    内部
    event.getModifiers()的值
  • 在包含操作列表的弹出窗口中添加一个
    KeyListener
当在菜单中单击操作时,第一个解决方案起作用,但当使用
Shift+Enter
选择它时,它不起作用。事实上,我甚至不能捕捉到任何关键事件,因为它们似乎被速度搜索捕捉到了

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

多亏我找到了答案

我使用以下代码创建了一个包含操作列表的弹出窗口:

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

如果你说的是
ListPopup
,那么我就这样对它进行了黑客攻击:我没有明确地使用
ListPopup
,但将我的弹出窗口转换为一个似乎有效。然而,现在我在
DataContext
方面遇到了问题。您的
getDataContext
返回一个
DataContext
,但该上下文中没有编辑器的值。你知道怎么解决吗?然后你用的是ListPopup,否则就不行了。不知道,你必须深入研究IntelliJ代码。也许这就是你所需要的:它不是我所需要的全部;我还必须创建一个
KeyEvent
,用作
handleSelect
的第二个参数,让操作了解修饰符。我马上给我的问题加一个答案。谢谢