User Interface Components
IntelliJ 平台包含大量自定义 Swing 组件。
在您的插件中使用这些组件将确保您的插件的外观和工作与 IDE 其余部分的 UI 一致,并且与使用默认的 Swing 组件相比通常可以减少代码大小。
值得注意的部分
ps: 这部分没必要全部按照文档来,直接大概学习,使用时遇到问题再参考文档。
The following components are particularly noteworthy:
Menus and toolbars are built using Actions
Tool Windows
Dialogs
Popups
Notifications
File and Class Choosers
Editor Components
List and Tree Controls
Status Bar Widgets
Tables (TableView) (TBD)
Drag & Drop Helpers (TBD)
Miscellaneous Swing Components
Messages
JBSplitter
JBTabs
以下是一些重要的 UI 组件的简要介绍:
-
JLabel(标签):用于显示文本或图像,通常用于向用户展示信息。
-
JTextField(文本框):用于接收用户输入的单行文本。
-
JTextArea(文本区域):用于接收用户输入的多行文本。
-
JButton(按钮):用于触发某个操作或执行特定的动作。
-
JCheckBox(复选框):允许用户选择一个或多个选项。
-
JRadioButton(单选按钮):允许用户在一组选项中选择一个。
-
JComboBox(下拉框):提供一个下拉菜单,用户可以从预定义的选项中选择一个。
-
JList(列表):显示一组选项,用户可以选择其中的一个或多个。
-
JScrollPane(滚动面板):用于包装大量内容,并提供滚动条来浏览内容。
-
JTable(表格):用于显示和编辑二维表格数据。
-
JPanel(面板):用于组织和容纳其他组件,可以用作布局容器。
-
JFrame(窗口):用于创建应用程序的顶级窗口。
这些是常见且常用的 UI 组件,它们可以用于构建各种类型的用户界面。每个组件都有其特定的功能和用途,你可以根据应用程序的需求选择适当的组件进行使用。
当然,Java Swing 还提供了其他许多组件和容器,以满足不同的用户界面设计和交互需求。
详细介绍一下 Tool Windows
Tool Windows(工具窗口)是 IntelliJ IDEA 提供的一种界面元素,用于提供特定功能和工具的可视化展示和操作。它们以独立的面板形式存在于 IDE 的边缘或特定区域,并可以根据用户的需要进行展开或收起。
Tool Windows 可以用于集成各种功能和工具,例如版本控制、数据库管理、构建工具、文件导航、搜索等。每个工具窗口都有其特定的功能和用途,可以帮助开发者提高工作效率。
以下是一些常见的 Tool Windows:
-
Project(项目):显示项目文件结构,允许导航和管理项目中的文件。
-
Version Control(版本控制):集成版本控制系统,如 Git、SVN 等,用于查看和管理代码版本、分支和提交记录。
-
Run/Debug(运行/调试):用于启动、运行和调试应用程序,提供控制台、调试窗口和运行配置等功能。
-
Terminal(终端):提供命令行界面,可以执行各种命令和脚本。
-
Database(数据库):用于连接和管理数据库,执行查询、编辑数据、导入导出等操作。
-
Maven/Gradle/Build(构建工具):用于管理项目的构建工具,执行构建、依赖管理和编译等操作。
-
Version Control(版本控制):集成版本控制系统,如 Git、SVN 等,用于查看和管理代码版本、分支和提交记录。
-
TODO(待办事项):显示代码中的待办事项,帮助开发者跟踪和管理任务。
-
Structure(结构):显示当前文件的结构,例如类、方法、字段等,方便导航和浏览代码。
-
Find(查找):提供强大的搜索功能,支持全局搜索、替换和正则表达式等。
通过工具窗口,开发者可以方便地访问和操作各种功能和工具,提高开发效率和舒适度。工具窗口通常可以通过 IDE 的菜单、快捷键或者点击相应的工具栏按钮来打开或关闭。你可以根据自己的需求和使用习惯来配置和使用工具窗口。
1. 介绍一下 ui 组件 Dialogs
Dialogs(对话框)是用户界面中常用的组件,用于与用户进行交互并获取输入或显示信息。
对话框通常作为模态窗口出现,意味着用户需要在对话框关闭之前处理它,以确保继续与应用程序进行交互。
Dialogs 可以用于多种场景,如显示警告、错误或确认消息、提示用户输入、进行选择或显示详细信息等。
以下是一些常见的 Dialogs 类型:
-
Message Dialogs(消息对话框):用于显示一般的消息,例如提示、警告或错误信息。通常只包含一个消息文本和一个确定按钮。
-
Input Dialogs(输入对话框):用于获取用户输入,例如要求用户输入文本、数字、密码等。通常包含一个消息文本、一个输入字段和确定/取消按钮。
-
Confirmation Dialogs(确认对话框):用于确认用户的操作,例如在执行重要操作之前要求用户确认。通常包含一个消息文本、一个确定按钮和一个取消按钮。
-
Option Dialogs(选项对话框):用于提供多个选项供用户选择。通常包含一个消息文本、多个选项按钮和一个取消按钮。
-
File Chooser Dialogs(文件选择对话框):用于选择文件或目录。可以选择单个文件、多个文件或整个目录。
Dialogs 提供了与用户进行交互的丰富功能,可以根据需求自定义对话框的内容、按钮、事件处理等。它们可以通过编程方式创建和显示,通常由应用程序的其他部分触发,并在用户完成操作后返回结果。
在使用 Dialogs 时,要注意用户体验和易用性,确保对话框的设计清晰、明确,并遵循用户界面的一致性和可访问性原则,以提供良好的用户体验。
2. 介绍一下 ui 组件 Popups
Popups(弹出窗口)是用户界面中常用的组件,用于在屏幕上方或下方显示临时的信息、菜单或用户界面。它们通常是短暂的、模态或非模态的,并提供了一种在用户界面上方或下方显示内容的方式,而不中断当前操作或转移焦点。
Popups 可以用于多种场景,例如:
-
Tooltips(工具提示):当用户将鼠标悬停在组件上时,显示一个短暂的、带有文本或其他信息的小窗口,用于提供有关组件的额外说明或提示。
-
Context Menus(上下文菜单):在用户右键单击组件或某个区域时,显示一个菜单,提供与当前上下文相关的操作选项。
-
Notifications(通知):用于显示临时的通知或警告消息,以向用户传达重要的信息,例如操作成功、错误提示或其他提示信息。
-
Popovers(弹出菜单):当用户点击某个元素时,显示一个临时的菜单或下拉列表,提供额外的选项或操作。
Popups 提供了一种轻量级、临时性的交互方式,可以在用户界面中提供额外的功能或信息,同时不会占据太多的屏幕空间或干扰用户的当前操作。
在使用 Popups 时,要注意设计的合理性和可用性,确保内容明确、易于理解,并且不会干扰用户的工作流程。
同时,应根据需要调整弹出窗口的位置、大小和外观,以适应不同的界面布局和用户体验需求。
3. ui 组件之 File and Class Choosers
File and Class Choosers(文件选择器和类选择器)是用户界面中常用的组件,用于让用户选择文件、目录或类名等相关信息。
-
文件选择器(File Choosers):文件选择器提供了一种让用户浏览和选择文件的交互方式。它通常包含一个文件浏览器界面,允许用户在文件系统中导航、打开文件、保存文件或选择文件夹。文件选择器还可以支持文件过滤器,以限制用户只能选择特定类型的文件。
-
类选择器(Class Choosers):类选择器允许用户从类路径中选择一个类名。它通常用于需要用户输入特定类的场景,例如配置文件中的类名或反射操作。类选择器提供一个文本框和一个浏览按钮,点击浏览按钮时,会弹出一个窗口显示类路径,并允许用户浏览和选择类。
File and Class Choosers 提供了方便的界面元素,用于与用户交互并获取相关信息。通过使用这些组件,可以简化用户选择文件、目录或类名的过程,提高用户体验和界面的可用性。在使用这些组件时,可以根据需要设置默认路径、文件过滤器、文件类型限制等,以满足具体的应用需求。
同时,需要注意用户界面的友好性和易用性,确保提供清晰的指示和提示,使用户能够轻松地找到并选择所需的文件或类。
文件选择实战
private void configImportButtonListener(final JPanel panel, final JButton configImportButton) {
configImportButton.addActionListener(e -> {
try {
FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor();
descriptor.setTitle("配置导入");
descriptor.setDescription("选择配置文件");
descriptor.setShowFileSystemRoots(true); // 显示文件系统根目录
descriptor.setHideIgnored(true); // 隐藏被忽略的文件
// 设置文件类型过滤器,例如只允许选择 Java 文件
descriptor.withFileFilter(file -> !file.isDirectory());
VirtualFile selectedFile = FileChooser.chooseFile(descriptor,
ProjectManager.getInstance().getDefaultProject(), null);
if (selectedFile != null) {
// 用户选择了文件
String selectedFilePath = selectedFile.getPath();
String fileContent = FileUtil.getFileContent(selectedFilePath);
DatabaseMigrateConfig config = JSON.parseObject(fileContent, DatabaseMigrateConfig.class);
initInputWithConfig(panel, config);
}
} catch (Exception ex) {
InnerMsgUtils.showError(ex);
}
});
}
文件保存实战
/**
* 配置导出按钮点击事件
*
* @param panel 面板
* @param configExportButton 导出按钮
*/
private void configExportButtonListener(final JPanel panel, final JButton configExportButton) {
configExportButton.addActionListener(e -> {
try {
FileSaverDescriptor descriptor = new FileSaverDescriptor("保存配置", "选择一个文件夹保存配置", "cfg");
FileSaverDialog saveFileDialog = FileChooserFactory.getInstance()
.createSaveFileDialog(descriptor, ProjectManager.getInstance().getDefaultProject());
VirtualFileWrapper saveFileWrapper = saveFileDialog.save(null, null);
if (saveFileWrapper != null) {
// 处理保存的文件路径
String saveFilePath = saveFileWrapper.getFile().getPath();
// ...
DatabaseMigrateConfig config = buildConfigFromInput(panel);
FileUtil.write(saveFilePath, JSON.toJSONString(config));
JOptionPane.showMessageDialog(null, "保存路径: " + saveFilePath);
}
} catch (Exception ex) {
InnerMsgUtils.showError(ex);
}
});
}
4. idea ui 组件 Editor Components
在 IntelliJ IDEA 中,Editor Components 是用于编辑代码的关键 UI 组件。
它们提供了强大的代码编辑功能和用户界面交互,使开发者能够高效地编辑和浏览源代码。
下面是一些常见的 IDEA UI 编辑器组件:
-
Editor(编辑器):Editor 是 IDEA 中用于显示和编辑代码的主要组件。它支持语法高亮、代码补全、代码折叠、代码格式化、代码导航等功能。每个打开的文件都在一个独立的编辑器中显示。
-
Document(文档):Document 是编辑器中的文本模型,它代表了编辑器中的源代码。开发者可以通过 Document 对象访问和修改代码的内容,例如插入、删除和替换文本等操作。
-
Caret(插入符):Caret 是一个可见的光标,标识当前编辑位置。它可以在文本中移动,用于选择、编辑和导航代码。IDEA 支持多个插入符,可以在不同的位置同时进行编辑。
-
Selection(选择):Selection 是编辑器中选定的文本部分。开发者可以通过选择文本来执行各种操作,如复制、剪切、粘贴和格式化等。
-
Highlighting(高亮显示):IDEA 提供了丰富的语法和错误高亮功能。它可以根据代码语法和语义进行高亮显示,帮助开发者快速识别和理解代码的结构。
-
Code Completion(代码补全):IDEA 提供智能的代码补全功能,可以根据上下文自动提示代码建议。它可以加快编码速度,减少拼写错误,并提供相关的代码文档和参数信息。
-
Code Folding(代码折叠):IDEA 支持代码折叠功能,允许开发者折叠或展开代码块,以便更好地组织和浏览源代码。
-
Code Navigation(代码导航):IDEA 提供多种代码导航功能,如跳转到定义、查找引用、查找符号等,帮助开发者快速定位和浏览代码的各个部分。
这些是 IntelliJ IDEA 中常见的 Editor Components。
它们共同构成了一个功能强大且可定制的代码编辑器,提供了丰富的编辑功能和交互体验,使开发者能够更加高效地编写和管理代码。
5. List and Tree Controls
在UI设计中,列表(List)和树(Tree)是常见的控件,用于显示和组织数据。
在IntelliJ IDEA中,也提供了列表和树控件,用于展示项目结构、文件列表、搜索结果等信息。下面是关于列表和树控件的详细介绍:
- List(列表):列表是一种线性的控件,用于显示一列项目或数据项。
在IntelliJ IDEA中,列表通常用于显示文件列表、搜索结果、选择项等。用户可以通过滚动、选择、点击等方式与列表交互。IntelliJ IDEA提供了丰富的功能来定制和操作列表,如多选、排序、过滤、拖放等。
- Tree(树):树是一种层级结构的控件,用于展示具有父子关系的数据。在IntelliJ IDEA中,树控件通常用于显示项目结构、包结构、文件系统等信息。用户可以通过展开、折叠、选择、勾选等方式与树交互。IntelliJ IDEA提供了丰富的功能来定制和操作树,如节点编辑、拖放、筛选、搜索等。
IntelliJ IDEA提供了相应的API来创建、配置和操作列表和树控件。开发者可以使用这些API来构建自定义的列表和树组件,并与其进行交互。一些常用的API包括:
JList
:用于创建和管理列表控件的基本类。DefaultListModel
:默认的列表模型,用于管理列表数据。JTree
:用于创建和管理树控件的基本类。DefaultTreeModel
:默认的树模型,用于管理树数据。
开发者可以使用这些类及其相关方法来创建、配置和操作列表和树控件,包括添加、删除、修改和获取数据项,设置选择和展开状态,自定义绘制和交互行为等。
列表和树控件在IntelliJ IDEA中广泛应用于项目导航、文件浏览、搜索和过滤、代码结构展示等场景,提供了方便的数据展示和导航功能,帮助开发者更好地理解和管理代码。
List 使用例子
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.ui.components.JBList;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
public class ListExampleDialog extends DialogWrapper {
private JBList<String> list;
protected ListExampleDialog(@Nullable Project project) {
super(project);
setTitle("List Example");
init();
}
@Nullable
@Override
protected JComponent createCenterPanel() {
// 创建一个字符串数组作为列表的数据
String[] fruits = {"Apple", "Banana", "Orange", "Mango", "Grapes"};
// 创建 JBList,并将字符串数组作为数据模型传入
list = new JBList<>(fruits);
// 设置列表显示的可见行数
list.setVisibleRowCount(5);
// 创建一个滚动面板,将列表添加到滚动面板中
JScrollPane scrollPane = new JScrollPane(list);
// 设置滚动面板的大小和首选大小
scrollPane.setPreferredSize(new Dimension(200, 150));
// 将滚动面板作为对话框的中心面板返回
return scrollPane;
}
@Override
protected void doOKAction() {
// 获取选中的列表项
String selectedValue = list.getSelectedValue();
if (selectedValue != null) {
// 显示选中的列表项
Messages.showMessageDialog(getRootPane(), "Selected Item: " + selectedValue, "Selected Item", Messages.getInformationIcon());
}
super.doOKAction();
}
public static void main(String[] args) {
ListExampleDialog dialog = new ListExampleDialog(null);
dialog.show();
}
}
看了下样式并没有很惊艳。
idea 组件介绍 Status Bar Widgets
Status Bar Widgets(状态栏小部件)是IntelliJ IDEA中的UI组件,用于在IDE状态栏中显示有关项目或IDE状态的信息。它们可以向用户提供有用的实时反馈和快捷操作。
IntelliJ IDEA提供了一些内置的Status Bar Widgets,也允许插件开发者创建自定义的Status Bar Widgets来满足特定需求。
以下是一些常见的内置Status Bar Widgets:
-
操作系统状态:显示操作系统的相关信息,例如CPU使用率、内存使用情况等。
-
代码检查:显示当前项目中的代码检查结果,如警告和错误数量。
-
版本控制:显示与版本控制系统(如Git、SVN)相关的信息,如当前分支、未提交的变更等。
-
构建进度:显示正在进行的构建任务的进度和状态。
-
语言设置:允许快速切换编辑器的语言设置,如Java、Python、JavaScript等。
-
编码设置:允许快速切换文件的编码设置,如UTF-8、GBK等。
这些小部件可以根据用户的需求进行配置,可以通过右键单击状态栏来打开”Configure Status Bar”菜单,选择要显示的小部件,调整它们的顺序和位置。
对于插件开发者,可以使用IntelliJ IDEA的API来创建自定义的Status Bar Widgets。插件开发者可以根据自己的需求,创建自定义的小部件来显示与插件功能相关的信息。
总之,Status Bar Widgets是IntelliJ IDEA的一个有用的UI组件,可以向用户提供实时信息和快捷操作,帮助提高开发效率。
其他 Swing 组件
Messages
Messages 类提供了一种显示简单消息框、输入对话框(带有文本字段的模式对话框)和选择器对话框(带有组合框的模式对话框)的方法。
类的不同方法的功能应该从它们的名称中一目了然。 在 macOS 上运行时,消息类显示的消息框使用本机 UI。
showCheckboxMessageDialog() 函数提供了一种在消息上实现不再显示复选框的简单方法。
请注意,建议在适当的时候使用非模态通知而不是模态消息框。 请参阅通知主题以获取更多信息。
JBSplitter
JBSplitter 类是 JetBrains 对标准 JSplitPane 类的替代。
与其他一些 JetBrains 增强型 Swing 组件不同,它不是直接替代品并且具有不同的 API。
但是,为了获得一致的用户体验,建议使用 JBSplitter 而不是标准的 JSplitPane。
要将组件添加到拆分器,请调用 setFirstComponent() 和 setSecondComponent() 方法。
JBSplitter 支持自动记忆分割比例。
要启用它,请调用 setSplitterProportionKey() 方法并传递用于存储比例的 ID。
JBTabs
JBTabs 类是 JetBrains 的选项卡控件实现,用于编辑器选项卡和一些其他组件。
与标准的 Swing 选项卡相比,它具有明显不同的外观和感觉,并且在 macOS 平台上看起来不那么原生,因此由开发人员选择哪个选项卡控件更合适。
Toolbars 工具栏
有关概述,请参阅 IntelliJ 平台 UI 指南中的工具栏。
从 Actions 构建 UI 包括创建基于 AnAction 的工具栏。
参考资料
https://plugins.jetbrains.com/docs/intellij/user-interface-components.html