1+ package org .mcdcl .ui ;
2+
3+ import java .util .ArrayList ;
4+ import java .util .List ;
5+ import java .util .Map ;
6+
7+ import org .to2mbn .jmccc .mcdownloader .RemoteVersion ;
8+ import org .to2mbn .jmccc .mcdownloader .RemoteVersionList ;
9+
10+ import javafx .collections .FXCollections ;
11+ import javafx .collections .ObservableList ;
12+ import javafx .geometry .Insets ;
13+ import javafx .geometry .Pos ;
14+ import javafx .scene .control .Button ;
15+ import javafx .scene .control .ButtonType ;
16+ import javafx .scene .control .Dialog ;
17+ import javafx .scene .control .Label ;
18+ import javafx .scene .control .ListView ;
19+ import javafx .scene .control .RadioButton ;
20+ import javafx .scene .control .ToggleGroup ;
21+ import javafx .scene .layout .HBox ;
22+ import javafx .scene .layout .VBox ;
23+ import javafx .stage .Modality ;
24+
25+ /**
26+ * Minecraft版本选择对话框
27+ */
28+ public class VersionSelectDialog extends Dialog <String > {
29+
30+ private ListView <String > versionList ;
31+ private ObservableList <String > versionItems ;
32+ private RemoteVersionList remoteVersionList ;
33+ private ToggleGroup versionTypeGroup ;
34+ private RadioButton releaseButton ;
35+ private RadioButton snapshotButton ;
36+ private RadioButton allButton ;
37+
38+ /**
39+ * 创建一个新的版本选择对话框
40+ *
41+ * @param remoteVersionList 远程版本列表
42+ */
43+ public VersionSelectDialog (RemoteVersionList remoteVersionList ) {
44+ this .remoteVersionList = remoteVersionList ;
45+
46+ // 设置对话框属性
47+ setTitle ("选择要下载的Minecraft版本" );
48+ setHeaderText ("请选择要下载的Minecraft版本" );
49+ initModality (Modality .APPLICATION_MODAL );
50+
51+ // 创建版本列表
52+ versionItems = FXCollections .observableArrayList ();
53+ versionList = new ListView <>(versionItems );
54+ versionList .setPrefHeight (300 );
55+ versionList .setPrefWidth (400 );
56+
57+ // 创建版本类型选择按钮
58+ versionTypeGroup = new ToggleGroup ();
59+
60+ releaseButton = new RadioButton ("正式版" );
61+ releaseButton .setToggleGroup (versionTypeGroup );
62+ releaseButton .setSelected (true );
63+ releaseButton .setOnAction (e -> updateVersionList ("release" ));
64+
65+ snapshotButton = new RadioButton ("快照版" );
66+ snapshotButton .setToggleGroup (versionTypeGroup );
67+ snapshotButton .setOnAction (e -> updateVersionList ("snapshot" ));
68+
69+ allButton = new RadioButton ("全部版本" );
70+ allButton .setToggleGroup (versionTypeGroup );
71+ allButton .setOnAction (e -> updateVersionList ("all" ));
72+
73+ // 创建版本类型选择布局
74+ HBox versionTypeBox = new HBox (15 );
75+ versionTypeBox .setAlignment (Pos .CENTER );
76+ versionTypeBox .getChildren ().addAll (releaseButton , snapshotButton , allButton );
77+
78+ // 创建主布局
79+ VBox content = new VBox (10 );
80+ content .setPadding (new Insets (10 ));
81+ content .getChildren ().addAll (
82+ new Label ("版本类型:" ),
83+ versionTypeBox ,
84+ new Label ("可用版本:" ),
85+ versionList
86+ );
87+
88+ // 设置对话框内容
89+ getDialogPane ().setContent (content );
90+
91+ // 添加按钮
92+ getDialogPane ().getButtonTypes ().addAll (ButtonType .OK , ButtonType .CANCEL );
93+
94+ // 设置结果转换器
95+ setResultConverter (buttonType -> {
96+ if (buttonType == ButtonType .OK ) {
97+ return versionList .getSelectionModel ().getSelectedItem ();
98+ }
99+ return null ;
100+ });
101+
102+ // 禁用确定按钮,直到选择了一个版本
103+ Button okButton = (Button ) getDialogPane ().lookupButton (ButtonType .OK );
104+ okButton .setDisable (true );
105+
106+ versionList .getSelectionModel ().selectedItemProperty ().addListener ((observable , oldValue , newValue ) -> {
107+ okButton .setDisable (newValue == null );
108+ });
109+
110+ // 初始加载版本列表
111+ updateVersionList ("release" );
112+ }
113+
114+ /**
115+ * 根据类型更新版本列表
116+ *
117+ * @param type 版本类型 (release, snapshot, all)
118+ */
119+ private void updateVersionList (String type ) {
120+ versionItems .clear ();
121+
122+ if (remoteVersionList == null ) {
123+ return ;
124+ }
125+
126+ Map <String , RemoteVersion > versions = remoteVersionList .getVersions ();
127+ List <String > filteredVersions = new ArrayList <>();
128+
129+ for (RemoteVersion version : versions .values ()) {
130+ if (type .equals ("all" ) ||
131+ (type .equals ("release" ) && "release" .equals (version .getType ())) ||
132+ (type .equals ("snapshot" ) && "snapshot" .equals (version .getType ()))) {
133+ filteredVersions .add (version .getVersion ());
134+ }
135+ }
136+
137+ versionItems .addAll (filteredVersions );
138+
139+ // 如果有版本,选择第一个
140+ if (!versionItems .isEmpty ()) {
141+ versionList .getSelectionModel ().select (0 );
142+ }
143+ }
144+ }
0 commit comments