Skip to content
This repository was archived by the owner on Dec 14, 2025. It is now read-only.

Commit ad11df1

Browse files
committed
feat(ui): 新增下载功能和版本管理界面
- 在主界面添加下载和版本管理按钮 - 实现下载视图,包含游戏、整合包、模组和资源包下载选项卡 - 添加版本管理视图,用于安装和删除版本 - 实现资源包管理器,用于获取可用资源包列表和下载资源包 - 新增版本管理器,用于获取可用版本列表和下载版本 TODO: 1.添加资源包列表和下载功能 2.添加模组列表和下载功能 3.添加整合包列表和下载功能
1 parent 7f4ac2d commit ad11df1

File tree

9 files changed

+658
-39
lines changed

9 files changed

+658
-39
lines changed

pom.xml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -113,32 +113,32 @@
113113
<artifactId>gson</artifactId>
114114
<version>2.10.1</version>
115115
</dependency>
116+
<dependency>
117+
<groupId>org.json</groupId>
118+
<artifactId>json</artifactId>
119+
<version>20231013</version>
120+
</dependency>
116121
</dependencies>
117122

118123
<build>
119124
<plugins>
120-
<!-- JavaFX Maven 插件 -->
121125
<plugin>
122-
<groupId>org.openjfx</groupId>
123-
<artifactId>javafx-maven-plugin</artifactId>
124-
<version>0.0.8</version>
126+
<groupId>org.apache.maven.plugins</groupId>
127+
<artifactId>maven-compiler-plugin</artifactId>
128+
<version>3.10.1</version>
125129
<configuration>
126-
<mainClass>org.mcdcl.Main</mainClass>
130+
<source>21</source>
131+
<target>21</target>
127132
</configuration>
128133
</plugin>
129134

130-
<!-- Maven 编译插件 -->
135+
<!-- 添加 JavaFX Maven 插件 -->
131136
<plugin>
132-
<groupId>org.apache.maven.plugins</groupId>
133-
<artifactId>maven-compiler-plugin</artifactId>
134-
<version>3.11.0</version>
137+
<groupId>org.openjfx</groupId>
138+
<artifactId>javafx-maven-plugin</artifactId>
139+
<version>0.0.8</version>
135140
<configuration>
136-
<source>${maven.compiler.source}</source>
137-
<target>${maven.compiler.target}</target>
138-
<enablePreview>true</enablePreview>
139-
<compilerArgs>
140-
<arg>--enable-preview</arg>
141-
</compilerArgs>
141+
<mainClass>org.mcdcl.Main</mainClass>
142142
</configuration>
143143
</plugin>
144144
</plugins>
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
package org.mcdcl.ui;
2+
3+
import java.util.List;
4+
5+
import org.mcdcl.util.VersionManager;
6+
7+
import javafx.animation.FadeTransition;
8+
import javafx.application.Platform;
9+
import javafx.geometry.Insets;
10+
import javafx.geometry.Pos;
11+
import javafx.scene.control.Alert;
12+
import javafx.scene.control.Alert.AlertType;
13+
import javafx.scene.control.Button;
14+
import javafx.scene.control.ComboBox;
15+
import javafx.scene.control.Label;
16+
import javafx.scene.control.ProgressBar;
17+
import javafx.scene.control.RadioButton;
18+
import javafx.scene.control.Tab;
19+
import javafx.scene.control.TabPane;
20+
import javafx.scene.control.ToggleGroup;
21+
import javafx.scene.layout.HBox;
22+
import javafx.scene.layout.VBox;
23+
import javafx.util.Duration;
24+
25+
public class DownloadView extends VBox {
26+
private TabPane tabPane;
27+
28+
public DownloadView() {
29+
// 初始化布局
30+
setPadding(new Insets(40, 10, 10, 10)); // 增加顶部边距,为返回按钮留出空间
31+
setSpacing(10);
32+
33+
// 创建选项卡面板
34+
tabPane = new TabPane();
35+
tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
36+
tabPane.getStyleClass().add("download-tabs"); // 添加自定义样式类
37+
38+
// 创建各个选项卡
39+
Tab gameTab = new Tab("游戏");
40+
gameTab.setContent(new GameDownloadTab());
41+
42+
Tab modpackTab = new Tab("整合包");
43+
modpackTab.setContent(new ModpackDownloadTab());
44+
45+
Tab modTab = new Tab("模组");
46+
modTab.setContent(new ModDownloadTab());
47+
48+
Tab resourceTab = new Tab("资源包");
49+
resourceTab.setContent(new ResourcePackDownloadTab());
50+
51+
// 添加选项卡到面板
52+
tabPane.getTabs().addAll(gameTab, modpackTab, modTab, resourceTab);
53+
54+
// 将选项卡面板添加到布局中
55+
getChildren().add(tabPane);
56+
}
57+
}
58+
59+
// 游戏下载选项卡
60+
class GameDownloadTab extends VBox {
61+
private ProgressBar progressBar;
62+
private Label progressLabel;
63+
private Button downloadButton;
64+
65+
public GameDownloadTab() {
66+
setPadding(new Insets(10));
67+
setSpacing(10);
68+
69+
Label titleLabel = new Label("下载新版本");
70+
titleLabel.getStyleClass().add("section-title");
71+
72+
// 添加版本类型选择
73+
ToggleGroup versionTypeGroup = new ToggleGroup();
74+
HBox versionTypeBox = new HBox(10);
75+
versionTypeBox.setAlignment(Pos.CENTER_LEFT);
76+
77+
RadioButton releaseButton = new RadioButton("正式版");
78+
releaseButton.setToggleGroup(versionTypeGroup);
79+
releaseButton.setSelected(true);
80+
81+
RadioButton snapshotButton = new RadioButton("快照版");
82+
snapshotButton.setToggleGroup(versionTypeGroup);
83+
84+
RadioButton allButton = new RadioButton("全部版本");
85+
allButton.setToggleGroup(versionTypeGroup);
86+
87+
versionTypeBox.getChildren().addAll(releaseButton, snapshotButton, allButton);
88+
89+
ComboBox<String> versionComboBox = new ComboBox<>();
90+
versionComboBox.setPromptText("选择要下载的版本");
91+
versionComboBox.setPrefWidth(200);
92+
93+
// 版本类型切换监听器
94+
versionTypeGroup.selectedToggleProperty().addListener((obs, oldVal, newVal) -> {
95+
try {
96+
VersionManager.VersionType type;
97+
RadioButton selected = (RadioButton) newVal;
98+
if (selected == snapshotButton) {
99+
type = VersionManager.VersionType.SNAPSHOT;
100+
} else if (selected == allButton) {
101+
type = VersionManager.VersionType.ALL;
102+
} else {
103+
type = VersionManager.VersionType.RELEASE;
104+
}
105+
List<String> versions = VersionManager.getAvailableVersions(type);
106+
versionComboBox.getItems().clear();
107+
versionComboBox.getItems().addAll(versions);
108+
} catch (Exception e) {
109+
Alert alert = new Alert(AlertType.ERROR);
110+
alert.setTitle("错误");
111+
alert.setHeaderText("获取版本列表失败");
112+
alert.setContentText(e.getMessage());
113+
alert.showAndWait();
114+
}
115+
});
116+
117+
// 创建进度条和标签
118+
progressBar = new ProgressBar(0);
119+
progressBar.setVisible(false);
120+
progressBar.setPrefWidth(200);
121+
122+
progressLabel = new Label("");
123+
progressLabel.setVisible(false);
124+
125+
Button downloadButton = new Button("下载");
126+
downloadButton.getStyleClass().add("download-button");
127+
downloadButton.setOnAction(e -> {
128+
String selectedVersion = versionComboBox.getValue();
129+
if (selectedVersion != null && !selectedVersion.isEmpty()) {
130+
// 禁用下载按钮
131+
downloadButton.setDisable(true);
132+
// 显示进度条
133+
progressBar.setVisible(true);
134+
progressLabel.setVisible(true);
135+
136+
// 在新线程中执行下载
137+
new Thread(() -> {
138+
try {
139+
VersionManager.downloadVersion(selectedVersion, progress -> {
140+
Platform.runLater(() -> {
141+
progressBar.setProgress(progress);
142+
progressLabel.setText(String.format("下载进度: %.1f%%", progress * 100));
143+
144+
if (progress >= 1.0) {
145+
// 显示下载完成
146+
progressLabel.setText("下载完成!");
147+
148+
// 创建淡出动画
149+
FadeTransition fadeOut = new FadeTransition(Duration.seconds(2));
150+
fadeOut.setNode(progressBar);
151+
fadeOut.setFromValue(1.0);
152+
fadeOut.setToValue(0.0);
153+
154+
FadeTransition labelFadeOut = new FadeTransition(Duration.seconds(2));
155+
labelFadeOut.setNode(progressLabel);
156+
labelFadeOut.setFromValue(1.0);
157+
labelFadeOut.setToValue(0.0);
158+
159+
// 动画完成后隐藏进度条和标签
160+
fadeOut.setOnFinished(event -> {
161+
progressBar.setVisible(false);
162+
progressLabel.setVisible(false);
163+
downloadButton.setDisable(false);
164+
});
165+
166+
// 启动动画
167+
fadeOut.play();
168+
labelFadeOut.play();
169+
170+
// 显示完成提示
171+
Alert alert = new Alert(AlertType.INFORMATION);
172+
alert.setTitle("下载完成");
173+
alert.setHeaderText("版本 " + selectedVersion + " 下载完成");
174+
alert.showAndWait();
175+
}
176+
});
177+
});
178+
} catch (Exception ex) {
179+
Platform.runLater(() -> {
180+
downloadButton.setDisable(false);
181+
Alert alert = new Alert(AlertType.ERROR);
182+
alert.setTitle("下载失败");
183+
alert.setHeaderText("版本下载失败");
184+
alert.setContentText(ex.getMessage());
185+
alert.showAndWait();
186+
});
187+
}
188+
}).start();
189+
} else {
190+
Alert alert = new Alert(AlertType.WARNING);
191+
alert.setTitle("警告");
192+
alert.setHeaderText("未选择版本");
193+
alert.setContentText("请先选择要下载的版本");
194+
alert.showAndWait();
195+
}
196+
});
197+
198+
// 加载可用版本列表
199+
try {
200+
List<String> versions = VersionManager.getAvailableVersions(VersionManager.VersionType.RELEASE);
201+
versionComboBox.getItems().addAll(versions);
202+
} catch (Exception e) {
203+
Alert alert = new Alert(AlertType.ERROR);
204+
alert.setTitle("错误");
205+
alert.setHeaderText("获取版本列表失败");
206+
alert.setContentText(e.getMessage());
207+
alert.showAndWait();
208+
}
209+
210+
getChildren().addAll(titleLabel, versionTypeBox, versionComboBox, progressBar, progressLabel, downloadButton);
211+
}
212+
}
213+
214+
// 整合包下载选项卡
215+
class ModpackDownloadTab extends VBox {
216+
public ModpackDownloadTab() {
217+
setPadding(new Insets(10));
218+
setSpacing(10);
219+
// TODO: 添加整合包列表和下载功能
220+
}
221+
}
222+
223+
// 模组下载选项卡
224+
class ModDownloadTab extends VBox {
225+
public ModDownloadTab() {
226+
setPadding(new Insets(10));
227+
setSpacing(10);
228+
// TODO: 添加模组列表和下载功能
229+
}
230+
}
231+
232+
// 资源包下载选项卡
233+
class ResourcePackDownloadTab extends VBox {
234+
public ResourcePackDownloadTab() {
235+
setPadding(new Insets(10));
236+
setSpacing(10);
237+
// TODO: 添加资源包列表和下载功能
238+
}
239+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
package org.mcdcl.ui;
3+
4+
import javafx.geometry.Insets;
5+
import javafx.geometry.Pos;
6+
import javafx.scene.control.Tab;
7+
import javafx.scene.control.TabPane;
8+
import javafx.scene.layout.Priority;
9+
import javafx.scene.layout.VBox;
10+
11+
public class GameView extends VBox {
12+
13+
public GameView() {
14+
setSpacing(15);
15+
setPadding(new Insets(20));
16+
setAlignment(Pos.TOP_CENTER);
17+
18+
// 创建子标签页
19+
TabPane gameTabPane = new TabPane();
20+
gameTabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
21+
22+
// 创建版本列表标签页
23+
Tab versionListTab = new Tab("版本列表");
24+
versionListTab.setContent(new VersionListView());
25+
26+
// 创建版本管理标签页
27+
Tab versionManagementTab = new Tab("版本管理");
28+
versionManagementTab.setContent(new VersionManagementView());
29+
30+
// 创建趣味功能标签页
31+
Tab moreFeaturesTab = new Tab("趣味功能");
32+
moreFeaturesTab.setContent(new MoreFeaturesView());
33+
34+
// 将标签页添加到TabPane
35+
gameTabPane.getTabs().addAll(versionListTab, versionManagementTab, moreFeaturesTab);
36+
37+
// 将TabPane添加到GameView
38+
getChildren().add(gameTabPane);
39+
40+
// 设置TabPane填充整个区域
41+
VBox.setVgrow(gameTabPane, Priority.ALWAYS);
42+
}
43+
}

0 commit comments

Comments
 (0)