使用修改键更改操作组
Change action group with modifier key
我有一个动作组,里面有很多动作。类似于按 Ctrl + Shift + F10
时出现的 运行 配置列表,我希望在用户按住 Shift
时执行不同的操作(或操作的变体),同时选择动作。
遗憾的是,documentation nor the code examples 都无法帮助我。我也没能找到上述 运行 配置操作组的源代码。
当然,我已经尝试了显而易见的解决方案:
- 正在检查
actionPerformed(ActionEvent)
中 event.getModifiers()
的值。
- 向包含操作列表的弹出窗口添加
KeyListener
。
虽然第一个解决方案在菜单中 单击 操作时有效,但在使用 Shift + Enter
选择它时无效。事实上,我什至无法捕获任何关键事件,因为它们似乎被速度搜索捕获了。
如何根据修改键更改操作组的行为?
感谢 Meo 我找到了答案。
我使用以下代码来创建包含操作列表的弹出窗口:
final ListPopup popup = JBPopupFactory.getInstance()
.createActionGroupPopup(...); // some parameters here
通过将该代码更改为以下代码,按 Shift + Enter
将 select 当前突出显示的选项并将正确的修饰符传递给操作的 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");
}
});
我有一个动作组,里面有很多动作。类似于按 Ctrl + Shift + F10
时出现的 运行 配置列表,我希望在用户按住 Shift
时执行不同的操作(或操作的变体),同时选择动作。
遗憾的是,documentation nor the code examples 都无法帮助我。我也没能找到上述 运行 配置操作组的源代码。
当然,我已经尝试了显而易见的解决方案:
- 正在检查
actionPerformed(ActionEvent)
中event.getModifiers()
的值。 - 向包含操作列表的弹出窗口添加
KeyListener
。
虽然第一个解决方案在菜单中 单击 操作时有效,但在使用 Shift + Enter
选择它时无效。事实上,我什至无法捕获任何关键事件,因为它们似乎被速度搜索捕获了。
如何根据修改键更改操作组的行为?
感谢 Meo 我找到了答案。
我使用以下代码来创建包含操作列表的弹出窗口:
final ListPopup popup = JBPopupFactory.getInstance()
.createActionGroupPopup(...); // some parameters here
通过将该代码更改为以下代码,按 Shift + Enter
将 select 当前突出显示的选项并将正确的修饰符传递给操作的 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");
}
});