
在 IntelliJ IDEA 插件开发中,UI 开发主要基于 Java Swing,但 JetBrains 提供了许多增强组件(JB 系列)和现代化的 Kotlin UI DSL。本文基于一个 Java 与 Kotlin 混用的实战项目,总结了从传统布局到现代 DSL 的核心知识点。
项目Demo地址:https://github.com/umuo/jetbrains-plugin-samples/tree/master/kotlin-layout-demo
在 build.gradle.kts 中配置好 Kotlin 插件后,项目可以完美支持双语混合开发。
src/main/java: 存放遗留代码或纯算法逻辑。src/main/kotlin: 存放 UI 代码、新的业务逻辑(推荐)。注意: 插件开发中,请优先使用
JBPanel,JBLabel,JBTextField等以JB开头的组件,它们能自动适配 IDEA 的明亮/暗黑主题。
最常用的顶层容器布局,将容器划分为 5 个区域。
+-----------------------------------------------------+
| North (PAGE_START) |
| (横向拉伸,高度取决于组件本身) |
+----------+-------------------------------+----------+
| | | |
| West | | East |
| (LINE_ | Center | (LINE_ |
| START) | (双向自动拉伸) | END) |
| | (占据所有剩余的空白区域) | |
| | | |
+----------+-------------------------------+----------+
| South (PAGE_END) |
+-----------------------------------------------------+
JBPanel<JBPanel<?>> panel = new JBPanel<>(new BorderLayout());
panel.add(new JButton("Top"), BorderLayout.NORTH);
panel.add(new JButton("Left"), BorderLayout.WEST);
panel.add(new JScrollPane(new JTextArea("Center")), BorderLayout.CENTER); // 自动填满
+-----------------------------------------------------+
| [Button 1] [Button 2] [Button 3 is Long] [Btn 4] |
| |
| [Btn 5] [Btn 6] |
| |
| (↑ 剩下的空间是空的) |
+-----------------------------------------------------+
| 说明: 自动换行,组件保持原有大小,不进行拉伸 |
+-----------------------------------------------------+
// 左对齐,水平垂直间距均为 20
JBPanel<JBPanel<?>> panel = new JBPanel<>(new FlowLayout(FlowLayout.LEFT, 20, 20));
panel.add(new JButton("Btn 1"));
panel.add(new JButton("Btn 2"));
Box.createVerticalGlue() 可以制作“弹簧”效果,把组件顶到最上方或最下方。+--------------------------+
| [ Item 1 (Fixed) ] |
+--------------------------+
| [ Item 2 (Fixed) ] |
+--------------------------+
| ^ |
| | |
| Vertical Glue |
| (弹簧: 撑开剩余空间) |
| | |
| v |
+--------------------------+
| [ Item 3 (Bottom) ] |
+--------------------------+
JBPanel<JBPanel<?>> panel = new JBPanel<>();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JButton("Item 1"));
panel.add(Box.createVerticalStrut(10)); // 固定间距
panel.add(new JButton("Item 2"));
+---------------------+---------------------+
| | |
| (0,0) | (0,1) |
| [Label short] | [Text Field Long] |
| | |
+---------------------+---------------------+
| | |
| (1,0) | (1,1) |
| [ Button ] | [ Button ] |
| | |
+---------------------+---------------------+
| 说明: 即使 (0,0) 内容很少,也被强制拉大 |
| 以匹配 (0,1) 的大小。 |
+---------------------+---------------------+
// 3行 2列
JBPanel<JBPanel<?>> panel = new JBPanel<>(new GridLayout(3, 2));
这是 Swing 中最强大但也最复杂的布局。它是 Kotlin UI DSL 的底层核心 。
GridBagConstraints):
gridx, gridy: 坐标。weightx, weighty: 抢占空间的权重 (0.0 不拉伸,1.0 抢占剩余空间)。fill: 当格子比组件大时,组件如何变形(HORIZONTAL, BOTH, NONE)。anchor: 当组件比格子小时,组件靠哪边停靠(LINE_START, LINE_END)。+----------------+------------------------------------+
| [ Label ] | [ Text Field (Resizes) ] |
| (weightx=0) | (weightx=1.0, fill=Horizontal) |
+----------------+------------------------------------+
| [ Title Spanning 2 Columns (gridwidth=2) ] |
+----------------+------------------------------------+
| | ^ |
| [ Side Menu ] | | |
| | | Text Area (Resizes Both) |
| (gridheight=2)| | (weightx=1.0, weighty=1.0) |
| | v |
+----------------+------------------------------------+
| [ Cancel ] | [ Submit (Right) ] |
+----------------+------------------------------------+
JBPanel panel = new JBPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
// 需要手动配置每一行代码
c.gridx = 0; c.gridy = 0;
c.weightx = 0;
panel.add(new JLabel("Label:"), c);
c.gridx = 1; c.gridy = 0;
c.weightx = 1.0; // 抢占水平空间
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(new JTextField(), c);
JetBrains 官方强烈推荐的声明式布局方式。它底层封装了 GridBagLayout,但提供了极简的 API。
无需计算坐标,代码结构即 UI 结构。
fun createPanel(): DialogPanel {
return panel {
row("Username:") {
textField()
.comment("Enter your name")
}
row {
checkBox("I agree")
}
}
}
| 布局方式 | 适用场景 | 复杂度 | 推荐指数 |
|---|---|---|---|
| BorderLayout | 页面主框架(上下左右中) | ⭐ | ⭐⭐⭐⭐⭐ |
| FlowLayout | 简单的按钮组 | ⭐ | ⭐⭐⭐ |
| BoxLayout | 简单的垂直列表 | ⭐⭐ | ⭐⭐ |
| GridLayout | 必须等宽等高的格子 | ⭐ | ⭐ |
| GridBagLayout | 极其复杂的定制布局 | ⭐⭐⭐⭐⭐ | ⭐ (除非为了练手) |
| Kotlin UI DSL | 表单、设置页、所有复杂交互 | ⭐⭐ | ⭐⭐⭐⭐⭐ (官方推荐) |