@@ -4,16 +4,18 @@ import com.intellij.openapi.Disposable
4
4
import com.intellij.openapi.util.Disposer
5
5
import com.intellij.ui.JBColor
6
6
import com.intellij.ui.components.JBPanel
7
- import com.intellij.ui.components.JBScrollPane
7
+ import com.intellij.ui.dsl.builder.AlignX
8
+ import com.intellij.ui.dsl.builder.AlignY
8
9
import com.intellij.ui.dsl.builder.panel
9
10
import com.intellij.util.ui.JBUI
10
11
import org.tabooproject.development.step.Module
11
- import java.awt.BorderLayout
12
+ import java.awt.GridBagConstraints
13
+ import java.awt.GridBagLayout
12
14
import java.awt.Dimension
13
15
14
16
/* *
15
17
* 模块选择面板,提供复选框树形结构和已选模块列表显示
16
- *
18
+ *
17
19
* @since 1.31
18
20
*/
19
21
class CheckModulePanel (
@@ -22,8 +24,7 @@ class CheckModulePanel(
22
24
23
25
private val checkModuleList = CheckModuleList ()
24
26
25
- private val checkModuleScrollPane = JBScrollPane (checkModuleList)
26
- private val displayModuleScrollPane = JBScrollPane (displayModuleList)
27
+ // CheckModuleList本身就是JScrollPane,DisplayModuleList内部有JBScrollPane
27
28
28
29
/* *
29
30
* 模块选择变更回调
@@ -34,25 +35,29 @@ class CheckModulePanel(
34
35
// 注册子组件到自身的 disposable
35
36
Disposer .register(this , checkModuleList as Disposable )
36
37
Disposer .register(this , displayModuleList as Disposable )
38
+
39
+ layout = GridBagLayout ()
37
40
38
- layout = BorderLayout ()
39
- preferredSize = Dimension (860 , 600 )
40
-
41
- // 创建更现代化的左侧面板
41
+ // 创建左侧面板(75%宽度)
42
42
val leftPanel = panel {
43
43
group(" 🔍 可用模块" , indent = false ) {
44
44
row {
45
- text(" <small>" +
46
- " 浏览并选择您项目的 TabooLib 模块" +
47
- " </small>" )
45
+ text(
46
+ " <small>" +
47
+ " 浏览并选择您项目的 TabooLib 模块" +
48
+ " </small>"
49
+ )
48
50
.apply {
49
51
component.border = JBUI .Borders .empty(0 , 0 , 8 , 0 )
50
52
}
51
53
}
52
54
row {
53
- scrollCell(checkModuleList)
55
+ cell(checkModuleList)
56
+ .align(AlignX .FILL )
54
57
.apply {
55
- component.preferredSize = Dimension (420 , 340 )
58
+ // CheckModuleList本身就是JScrollPane,无需再包装
59
+ component.preferredSize = Dimension (480 , 350 ) // 调整为75%宽度
60
+ component.minimumSize = Dimension (480 , 100 )
56
61
component.border = JBUI .Borders .compound(
57
62
JBUI .Borders .customLine(JBColor .border()),
58
63
JBUI .Borders .empty(5 )
@@ -61,25 +66,30 @@ class CheckModulePanel(
61
66
}
62
67
}
63
68
}.apply {
64
- border = JBUI .Borders .empty(15 , 15 , 10 , 10 ) // 统一边距
69
+ border = JBUI .Borders .empty(15 , 15 , 10 , 5 ) // 右边距减少
65
70
background = JBColor .namedColor(" Panel.background" , JBColor .WHITE )
66
71
}
67
-
68
- // 创建更优雅的右侧面板
72
+
73
+ // 创建右侧面板(25%宽度)
69
74
val rightPanel = panel {
70
75
group(" ✅ 已选模块" , indent = false ) {
71
76
row {
72
- text(" <small>" +
73
- " 您选择的模块 - 点击可移除" +
74
- " </small>" )
77
+ text(
78
+ " <small>" +
79
+ " 您选择的模块 - 点击可移除" +
80
+ " </small>"
81
+ )
75
82
.apply {
76
83
component.border = JBUI .Borders .empty(0 , 0 , 8 , 0 )
77
84
}
78
85
}
79
86
row {
80
- scrollCell(displayModuleList)
87
+ cell(displayModuleList)
88
+ .align(AlignX .FILL )
81
89
.apply {
82
- component.preferredSize = Dimension (380 , 340 )
90
+ // DisplayModuleList内部已有滚动面板,无需再包装
91
+ component.preferredSize = Dimension (240 , 350 ) // 调整为25%宽度
92
+ component.minimumSize = Dimension (240 , 150 )
83
93
component.border = JBUI .Borders .compound(
84
94
JBUI .Borders .customLine(JBColor .border()),
85
95
JBUI .Borders .empty(3 )
@@ -93,48 +103,53 @@ class CheckModulePanel(
93
103
}
94
104
}
95
105
}.apply {
96
- border = JBUI .Borders .empty(15 , 15 , 10 , 10 ) // 统一边距,与左侧保持一致
106
+ border = JBUI .Borders .empty(15 , 5 , 10 , 15 ) // 左边距减少,右边距保持
97
107
background = JBColor .namedColor(" Panel.background" , JBColor .WHITE )
98
108
}
109
+
110
+ // 使用GridBagLayout进行精确布局
111
+ val leftConstraints = GridBagConstraints ().apply {
112
+ gridx = 0
113
+ gridy = 0
114
+ weightx = 0.75 // 75%宽度
115
+ weighty = 1.0
116
+ fill = GridBagConstraints .BOTH
117
+ anchor = GridBagConstraints .NORTHWEST // 顶部对齐
118
+ }
99
119
100
- add(leftPanel, BorderLayout .CENTER ) // 左侧占据主要空间
101
- add(rightPanel, BorderLayout .EAST ) // 右侧固定宽度
120
+ val rightConstraints = GridBagConstraints ().apply {
121
+ gridx = 1
122
+ gridy = 0
123
+ weightx = 0.25 // 25%宽度
124
+ weighty = 1.0
125
+ fill = GridBagConstraints .BOTH
126
+ anchor = GridBagConstraints .NORTHWEST // 顶部对齐
127
+ }
102
128
129
+ add(leftPanel, leftConstraints)
130
+ add(rightPanel, rightConstraints)
131
+
103
132
// 设置模块选择回调
104
133
checkModuleList.onModuleSelectionChanged = { modules ->
105
134
displayModuleList.setModules(modules)
106
135
onModuleSelectionChanged?.invoke(modules)
107
136
}
108
-
137
+
109
138
// 设置右侧列表的点击移除回调
110
139
displayModuleList.onModuleRemoved = { module ->
111
140
println (" DisplayModuleList: 尝试移除模块 ${module.name} (${module.id} )" )
112
141
checkModuleList.unselectModule(module.id)
113
142
}
114
-
115
- // 优化滚动条样式
116
- checkModuleScrollPane.apply {
117
- verticalScrollBarPolicy = JBScrollPane .VERTICAL_SCROLLBAR_AS_NEEDED
118
- horizontalScrollBarPolicy = JBScrollPane .HORIZONTAL_SCROLLBAR_NEVER // 禁用水平滚动
119
- border = JBUI .Borders .empty()
120
- }
121
-
122
- displayModuleScrollPane.apply {
123
- verticalScrollBarPolicy = JBScrollPane .VERTICAL_SCROLLBAR_AS_NEEDED
124
- horizontalScrollBarPolicy = JBScrollPane .HORIZONTAL_SCROLLBAR_NEVER // 禁用水平滚动
125
- border = JBUI .Borders .empty()
126
- }
127
143
}
128
144
129
145
/* *
130
146
* 设置模块数据
131
- *
147
+ *
132
148
* @param modules 模块映射,key为分类名称,value为该分类下的模块列表
133
149
*/
134
150
fun setModules (modules : Map <String , List <Module >>) {
135
151
checkModuleList.setModules(modules)
136
-
137
- checkModuleScrollPane.size = checkModuleScrollPane.preferredSize
152
+ // 移除多余的滚动面板大小设置,让组件自然调整
138
153
}
139
154
140
155
/* *
0 commit comments