企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# [Actions分组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html)  [未文字矫正] <br> 如果一个实现需要多个动作,或者有太多的动作使菜单不够用,则可以将这些动作分组。本教程演示了向现有组添加动作、创建新动作组以及具有可变数量动作的动作组。本教程中讨论的示例代码来自代码示例[`action_basics`](https://github.com/JetBrains/intellij-sdk-code-samples/tree/main/action_basics)。 本教程中的某些内容假定读者熟悉[创建actions](https://plugins.jetbrains.com/docs/intellij/working-with-custom-actions.html)教程。 <br> ***** ## [简单action组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#simple-action-groups) 在第一个示例中,action组将作为顶级菜单项提供,操作表示为下拉菜单项。该组基于默认的 IntelliJ 平台实现。 <br> ***** ### [创建简单组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#creating-simple-groups) 可以通过向插件文件`<group>`的`<actions>`部分添加元素来注册分组`plugin.xml`。此示例`class`在`<group>`元素中没有属性,因为 IntelliJ 平台框架将为组提供默认实现类。如果属于该组的一组动作是静态的,即在运行时不改变,则使用此默认实现,这是大多数情况。该`id`属性必须是唯一的,因此合并插件 ID 或包名称是最佳做法。 该`popup`属性确定组中的操作是否放置在子菜单中。该`icon`属性指定[`Icon`](https://plugins.jetbrains.com/docs/intellij/work-with-icons-and-images.html)要显示的对象的 FQN。没有`compact`指定属性,这意味着该组将支持子菜单。有关这些属性的更多信息,请参阅[在 plugin.xml 中注册操作](https://plugins.jetbrains.com/docs/intellij/basic-action-system.html#registering-actions-in-pluginxml)。 ~~~ <group id="org.intellij.sdk.action.GroupedActions" text="Static Grouped Actions" popup="true" icon="SdkIcons.Sdk_default_icon"> </group> ~~~ <br> ***** ### [将action组绑定到 UI 组件](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#binding-action-groups-to-ui-components) 以下示例显示如何使用`<add-to-group>`元素将自定义操作组相对于“**工具”**菜单中的条目放置。属性`relative-to-action`引用行动`id`的`PopupDialogAction`,不是原生的IntelliJ菜单项。而是`PopupDialogAction`在同一个[`plugin.xml`](https://github.com/JetBrains/intellij-sdk-code-samples/blob/main/action_basics/src/main/resources/META-INF/plugin.xml)文件中定义。该组放置在操作的单个条目之后`PopupDialogAction`,如教程[创建操作中](https://plugins.jetbrains.com/docs/intellij/working-with-custom-actions.html#registering-an-action-with-the-new-action-form)所定义。 ~~~ <group id="org.intellij.sdk.action.GroupedActions" text="Static Grouped Actions" popup="true" icon="SdkIcons.Sdk_default_icon"> <add-to-group group-id="ToolsMenu" anchor="after" relative-to-action="org.intellij.sdk.action.PopupDialogAction"/> </group> ~~~ <br> ***** ### [向静态分组操作添加新操作](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#adding-a-new-action-to-the-static-grouped-actions) 该`PopupDialogAction`实现将被重用并注册到新创建的静态组中。`id`重用`PopupDialogAction`实现的属性设置为唯一值`org.intellij.sdk.action.GroupPopDialogAction`。此值将这个新`<action>`条目与`id`之前用于在[创建操作](https://plugins.jetbrains.com/docs/intellij/working-with-custom-actions.html#registering-an-action-with-the-new-action-form)教程中注册此操作实现的条目区分开来。一个独特的`id`支持在多个菜单或组中重用操作类。该组中的操作将显示菜单文本“A Group Action”。 ~~~ <group id="org.intellij.sdk.action.GroupedActions" text="Static Grouped Actions" popup="true" icon="SdkIcons.Sdk_default_icon"> <add-to-group group-id="ToolsMenu" anchor="after" relative-to-action="org.intellij.sdk.action.PopupDialogAction"/> <action class="org.intellij.sdk.action.PopupDialogAction" id="org.intellij.sdk.action.GroupPopDialogAction" text="A Group Action" description="SDK static grouped action example" icon="SdkIcons.Sdk_default_icon"> </action> </group> ~~~ <br> 执行上述步骤后,操作组及其内容将在“**工具”**菜单中可用。底层`PopupDialogAction`实现被重用于**工具**菜单中的两个条目: * 在[创建actions](https://plugins.jetbrains.com/docs/intellij/working-with-custom-actions.html#registering-an-action-with-the-new-action-form)教程中,一次用于顶部菜单条目**Tools | Pop Dialog Action** 的action`id` 与 `org.intellij.sdk.action.PopupDialogAction`相同。 * 第二次为菜单项**Tools | Static Grouped Actions | A Group Action**的 action `id`等于`org.intellij.sdk.action.GroupPopDialogAction`。 ![简单行动组](https://plugins.jetbrains.com/docs/intellij/images/grouped_action.png "简单行动组") <br> ***** ## [实现自定义操作组类](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#implementing-custom-action-group-classes) 在某些情况下,一组动作的具体行为需要依赖于上下文。该解决方案类似于使[单个操作条目依赖于上下文](https://plugins.jetbrains.com/docs/intellij/working-with-custom-actions.html#extending-the-update-method)。 <br> 以下步骤显示了如何在满足某些条件时使一组操作可用和可见。在这种情况下,条件是有一个编辑器实例可用。此条件是必需的,因为自定义操作组已添加到仅启用编辑功能的 IntelliJ 菜单中。 <br> ***** ### [扩展 DefaultActionGroup](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#extending-defaultactiongroup) 该[`DefaultActionGroup`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/platform-api/src/com/intellij/openapi/actionSystem/DefaultActionGroup.java)是的实现[`ActionGroup`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/ActionGroup.java)。在`DefaultActionGroup`类用于它们之间添加子行动和分离到一个组。如果属于该组的一组操作在运行时未更改,则使用此类。 例如,扩展[`DefaultActionGroup`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/platform-api/src/com/intellij/openapi/actionSystem/DefaultActionGroup.java)以创建代码示例中的`CustomDefaultActionGroup`类`action_basics`: ~~~ public class CustomDefaultActionGroup extends DefaultActionGroup { @Override public void update(AnActionEvent event) { // Enable/disable depending on whether user is editing... } } ~~~ <br> ***** ### [注册自定义操作组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#registering-the-custom-action-group) 与静态acgtion组的情况一样,`<group>`action应该 在`plugin.xml`文件的 `<actions>`部分中声明,例如[action\_basics](https://github.com/JetBrains/intellij-sdk-code-samples/blob/main/action_basics/src/main/resources/META-INF/plugin.xml)插件。出于演示目的,此实现将使用本地化。 <br> 下面的`<group>`元素声明显示: * `<actions>`本地化操作部分之外的可选资源包声明。 * 元素中`class`属性的存在`<group>`告诉 IntelliJ 平台框架使用`CustomDefaultActionGroup`而不是默认实现。 * 设置组的`popup`属性以允许子菜单。 * 将`text`和`description`属性在省略`<group>`声明赞成使用的本地化资源包来定义他们。 * `icon`该组没有属性;该`CustomDefaultActionGroup`实现将为组[添加一个图标](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#providing-specific-behavior-for-the-custom-group)。 * 该`<add-to-group>`元素指定在现有 的第一个位置添加组`EditorPopupMenu`。 ~~~ <resource-bundle>messages.BasicActionsBundle</resource-bundle> <actions> <group id="org.intellij.sdk.action.CustomDefaultActionGroup" class="org.intellij.sdk.action.CustomDefaultActionGroup" popup="true"> <add-to-group group-id="EditorPopupMenu" anchor="first"/> </group> </actions> ~~~ <br> ***** ### [向自定义组添加操作](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#adding-actions-to-the-custom-group) 与[静态分组操作一样](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#adding-a-new-action-to-the-static-grouped-actions),`PopupDialogAction`操作作为`<action>`元素添加到`<group>`元素中。在`<action>`下面的元素声明中: * 元素中的`class`属性`<action>`具有相同的 FQN 以重用此操作实现。 * 该`id`属性是唯一的,以区别于 Action System 中实现的其他用途。 * 的`text`和`description`属性在省略`<action>`声明;它们是使用本地化资源包定义的。 * 声明 SDK 图标用于此操作。 ~~~ <group id="org.intellij.sdk.action.CustomDefaultActionGroup" class="org.intellij.sdk.action.CustomDefaultActionGroup" popup="true" icon="SdkIcons.Sdk_default_icon"> <add-to-group group-id="EditorPopupMenu" anchor="first"/> <action id="org.intellij.sdk.action.CustomGroupedAction" class="org.intellij.sdk.action.PopupDialogAction" icon="SdkIcons.Sdk_default_icon"/> </group> ~~~ <br> 现在必须根据[Localizing Actions and Groups](https://plugins.jetbrains.com/docs/intellij/basic-action-system.html#localizing-actions-and-groups)在资源包文件中提供`text`和`description`属性的翻译。请注意,有两组和翻译,一组用于动作,一组用于组。可以想象,如果动作使用了属性,可能会有另一组翻译。[`BasicActionsBundle.properties`](https://github.com/JetBrains/intellij-sdk-code-samples/blob/main/action_basics/src/main/resources/messages/BasicActionsBundle.properties)[](https://plugins.jetbrains.com/docs/intellij/basic-action-system.html#localizing-actions-and-groups)`text``description``<override-text>` ~~~ action.org.intellij.sdk.action.CustomGroupedAction.text=A Popup Action[en] action.org.intellij.sdk.action.CustomGroupedAction.description=SDK popup grouped action example[en] group.org.intellij.sdk.action.CustomDefaultActionGroup.text=Popup Grouped Actions[en] group.org.intellij.sdk.action.CustomDefaultActionGroup.description=Custom defaultActionGroup demo[en] ~~~ <br> ***** ### [为自定义组提供特定行为](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#providing-specific-behavior-for-the-custom-group) `CustomDefaultActionGroup.update()`仅当有可用的编辑器实例时,重写该方法才能使组可见。此外,添加了一个自定义图标来演示可以根据操作上下文更改组图标: ~~~ public class CustomDefaultActionGroup extends DefaultActionGroup { @Override public void update(AnActionEvent event) { // Enable/disable depending on whether user is editing Editor editor = event.getData(CommonDataKeys.EDITOR); event.getPresentation().setEnabled(editor != null); // Take this opportunity to set an icon for the group. event.getPresentation().setIcon(SdkIcons.Sdk_default_icon); } } ~~~ <br> 编译并运行上面的代码示例后,在编辑器中打开一个文件并右键单击,将弹出**编辑**菜单,其中第一个位置包含一组新的动作。请注意,组和操作来自资源文件,因为它们都包含后缀“\[en\]”。新组还将有一个图标: ![自定义操作组](https://plugins.jetbrains.com/docs/intellij/images/editor_popup_menu.png "自定义操作组") <br> ***** ## [具有可变动作集的动作组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#action-groups-with-variable-actions-sets) 如果属于自定义组的一组操作因上下文而异,则该组必须扩展[`ActionGroup`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/ActionGroup.java).中的操作集`ActionGroup`是动态定义的。 <br> ***** ### [创建可变操作组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#creating-variable-action-group) 要创建一个数量可变的action组,请扩展`ActionGroup`.例如,在`action_basics`类[`DynamicActionGroup`](https://github.com/JetBrains/intellij-sdk-code-samples/blob/main/action_basics/src/main/java/org/intellij/sdk/action/DynamicActionGroup.java)代码中: ~~~ public class DynamicActionGroup extends ActionGroup { } ~~~ <br> ***** ### [注册可变action组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#registering-a-variable-action-group) 要注册动态菜单组,`<group>`需要在[.xml](https://github.com/JetBrains/intellij-sdk-code-samples/blob/main/action_basics/src/main/resources/META-INF/plugin.xml)`<actions>`部分放置一个属性。启用后,该组会出现在“**工具”**菜单中“[静态分组操作”](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#binding-action-groups-to-ui-components)正下方的条目处:[`plugin`](https://github.com/JetBrains/intellij-sdk-code-samples/blob/main/action_basics/src/main/resources/META-INF/plugin.xml)[](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#binding-action-groups-to-ui-components) ~~~ <group id="org.intellij.sdk.action.DynamicActionGroup" class="org.intellij.sdk.action.DynamicActionGroup" popup="true" text="Dynamically Grouped Actions" description="SDK dynamically grouped action example" icon="SdkIcons.Sdk_default_icon"> <add-to-group group-id="ToolsMenu" anchor="after" relative-to-action="org.intellij.sdk.action.GroupedActions"/> </group> ~~~ <br> > 如果`<group>`元素的`class`属性命名从 派生的类`ActionGroup`,则`<action>`该组中的任何静态声明都会引发异常。对于静态定义的组,请使用`DefaultActionGroup`。 <br> ***** ### [将子actions添加到动态组](https://plugins.jetbrains.com/docs/intellij/grouping-action.html#adding-child-actions-to-the-dynamic-group) 要将action添加到`DynamicActionGroup`,`AnAction`应从该`DynamicActionGroup.getChildren()`方法返回一个非空的实例数组。再次,重用`PopupDialogAction`实现。这个用例是`PopupDialogAction`覆盖构造函数的原因: ~~~ public class DynamicActionGroup extends ActionGroup { @NotNull @Override public AnAction[] getChildren(AnActionEvent e) { return new AnAction[]{ new PopupDialogAction("Action Added at Runtime", "Dynamic Action Demo", SdkIcons.Sdk_default_icon) }; } } ~~~ <br> 在提供了 的实现`DynamicActionGroup`并使其返回一个非空的动作数组之后,**工具**菜单中的第三个位置将包含一组新的动作: ![动态行动组](https://plugins.jetbrains.com/docs/intellij/images/dynamic_action_group.png "动态行动组")