# [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 "动态行动组")
- 空白目录
- 测试
- ReadMe
- Idea
- Introduction介绍
- Part01-Plugins插件
- 创建你第一个插件
- 用github模版
- 用Gradle
- Gradle入门
- 配置Gradle项目
- 使用Gradle发布插件
- 用DevKit
- 创建开发环境
- 创建一个插件项目
- 运行和debug一个插件
- 部署一个插件
- 发布一个插件
- IDE开发实例
- 将插件发布到自定义插件存储库
- 插件结构
- 插件内容
- 类加载器
- Actions
- 扩展
- 服务
- 监听器
- 扩展点
- Components
- 插件配置文件
- 插件Logo
- 依赖
- 动态插件
- IntelliJ平台工件库
- 插件开发者的 Kotlin
- 插件签名
- 内部Actions菜单
- 启用内部模式
- 内部操作 - UI 子菜单
- 内部操作 - UI 检查器
- 内部操作 - LaF 默认值
- 性能优化
- 插件开发常见问题
- Part02-基础平台
- 基础
- 处理器和一次性
- 一般线程规则
- 消息基础设施
- IDE基础设施
- 用户界面组件
- 工具窗口
- 对话框
- Popups
- 通知
- 文件和类选择器
- 编辑器组件
- 列表和树控件
- 其他Swing组件
- 使用图标和图像
- 配色方案管理
- Kotlin 用户界面 DSL
- JCEF - Java Chromium 嵌入式框架
- 自定义 UI 主题
- 创建自定义 UI 主题
- 自定义 UI 主题 - 图标和 UI 控件
- UI 主题 - 编辑器方案和背景图像
- 公开主题元数据
- Actions
- Actions教程
- 创建Actions
- Actions分组
- 持久化模型
- 组件的持久状态
- 持久化敏感数据
- 设置
- 设置指南
- 自定义设置组
- 设置教程
- 文件
- 虚拟文件系统
- 虚拟文件
- 文档
- 编辑
- 编辑器基础
- xxx
- 代码实现
- Temp-理解
- xxx