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
的第二个参数,让操作了解修饰符。我马上给我的问题加一个答案。谢谢