|
@@ -16,71 +16,135 @@ import java.io.*;
|
|
import java.util.Objects;
|
|
import java.util.Objects;
|
|
|
|
|
|
public class HelloController {
|
|
public class HelloController {
|
|
|
|
+ /**
|
|
|
|
+ * 初始化方法,用于设置控制台输出重定向、初始化Java环境和配置
|
|
|
|
+ * 此方法依次重定向系统输出和错误流到自定义的ConsoleOutputStream,
|
|
|
|
+ * 以将输出信息显示在图形界面的LogArea中同时保持控制台输出
|
|
|
|
+ * 此外,它还负责初始化Java环境,检查根目录,初始化版本选择和最大内存设置
|
|
|
|
+ * 最后,它创建必要的目录和配置文件,以确保应用程序可以正常运行
|
|
|
|
+ *
|
|
|
|
+ * @throws InterruptedException 如果在初始化过程中线程被中断
|
|
|
|
+ */
|
|
public void initialize() throws InterruptedException {
|
|
public void initialize() throws InterruptedException {
|
|
// 将标准输出流重定向到TextArea
|
|
// 将标准输出流重定向到TextArea
|
|
System.setOut(new ConsoleOutputStream(System.out, LogArea::appendText));
|
|
System.setOut(new ConsoleOutputStream(System.out, LogArea::appendText));
|
|
// 将标准错误流重定向到TextArea
|
|
// 将标准错误流重定向到TextArea
|
|
System.setErr(new ConsoleOutputStream(System.err, LogArea::appendText));
|
|
System.setErr(new ConsoleOutputStream(System.err, LogArea::appendText));
|
|
|
|
+
|
|
|
|
+ // 打印应用程序启动的ASCII艺术
|
|
System.out.println(" ____ _ _ ____ _ \n" +
|
|
System.out.println(" ____ _ _ ____ _ \n" +
|
|
"/ ___|| \\ | |/ ___| | \n" +
|
|
"/ ___|| \\ | |/ ___| | \n" +
|
|
"\\___ \\| \\| | | _| | \n" +
|
|
"\\___ \\| \\| | | _| | \n" +
|
|
" ___) | |\\ | |_| | |___ \n" +
|
|
" ___) | |\\ | |_| | |___ \n" +
|
|
"|____/|_| \\_|\\____|_____|");
|
|
"|____/|_| \\_|\\____|_____|");
|
|
|
|
+
|
|
|
|
+ // 初始化Java环境
|
|
InitializeJavaEnviroment();
|
|
InitializeJavaEnviroment();
|
|
|
|
+ // 检查根目录是否存在
|
|
CheckRootDirectory();
|
|
CheckRootDirectory();
|
|
|
|
+ // 初始化版本选择
|
|
InitializeVersionChoice();
|
|
InitializeVersionChoice();
|
|
|
|
+ // 初始化最大内存设置
|
|
InitializeMaxMem();
|
|
InitializeMaxMem();
|
|
|
|
+ // 设置最大内存监听
|
|
SetMaxMemListen();
|
|
SetMaxMemListen();
|
|
|
|
+
|
|
|
|
+ // 定义目录名和文件名
|
|
String directoryName = "SNGL";
|
|
String directoryName = "SNGL";
|
|
String directoryPath = "SNGL";
|
|
String directoryPath = "SNGL";
|
|
String fileName = "sngl.json";
|
|
String fileName = "sngl.json";
|
|
|
|
+
|
|
|
|
+ // 创建目录,如果不存在的话
|
|
ConfigCore.CreateDirectory.createDirectoryIfNotExists(directoryName);
|
|
ConfigCore.CreateDirectory.createDirectoryIfNotExists(directoryName);
|
|
directoryName = ".minecraft";
|
|
directoryName = ".minecraft";
|
|
ConfigCore.CreateDirectory.createDirectoryIfNotExists(directoryName);
|
|
ConfigCore.CreateDirectory.createDirectoryIfNotExists(directoryName);
|
|
|
|
+
|
|
|
|
+ // 检查并创建配置文件,如果不存在的话
|
|
if (ConfigCore.CreateConfig.checkAndCreateFile(directoryPath, fileName)) {
|
|
if (ConfigCore.CreateConfig.checkAndCreateFile(directoryPath, fileName)) {
|
|
System.out.println("文件 " + fileName + " 已创建在 " + directoryPath + " 目录下");
|
|
System.out.println("文件 " + fileName + " 已创建在 " + directoryPath + " 目录下");
|
|
} else {
|
|
} else {
|
|
System.out.println("文件 " + fileName + " 已存在于 " + directoryPath + " 目录下");
|
|
System.out.println("文件 " + fileName + " 已存在于 " + directoryPath + " 目录下");
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 显示错误提示对话框
|
|
|
|
+ * 此方法用于在图形界面上向用户显示错误信息它创建一个弹出对话框,
|
|
|
|
+ * 设置错误类型、标题和内容,并等待用户响应
|
|
|
|
+ *
|
|
|
|
+ * @param message 要显示的错误信息
|
|
|
|
+ */
|
|
private void showAlert(String message) {
|
|
private void showAlert(String message) {
|
|
|
|
+ // 创建一个信息类型的警告对话框
|
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
|
|
|
+ // 设置对话框的标题为"错误"
|
|
alert.setTitle("错误");
|
|
alert.setTitle("错误");
|
|
|
|
+ // 设置对话框的头部文本为null,以简化界面
|
|
alert.setHeaderText(null);
|
|
alert.setHeaderText(null);
|
|
|
|
+ // 设置对话框的内容文本为传入的错误信息
|
|
alert.setContentText(message);
|
|
alert.setContentText(message);
|
|
|
|
+ // 显示对话框并等待用户响应
|
|
alert.showAndWait();
|
|
alert.showAndWait();
|
|
}
|
|
}
|
|
- @FXML//启动按钮实现
|
|
|
|
|
|
+
|
|
|
|
+ @FXML//启动按钮实现
|
|
|
|
+/**
|
|
|
|
+ * 当用户点击启动按钮时调用此方法
|
|
|
|
+ * 它收集用户输入,如玩家名称、游戏版本、Java环境设置等,并启动游戏
|
|
|
|
+ */
|
|
protected void StartButtonClick() {
|
|
protected void StartButtonClick() {
|
|
- LaunchCore.Player_Name = PlayerNameInput.getText();
|
|
|
|
- System.out.println(LaunchCore.Player_Name);
|
|
|
|
- System.out.println(SetMaxMem.getValue());
|
|
|
|
- LaunchCore.Max_Mem = (int) SetMaxMem.getValue();
|
|
|
|
- if (!Objects.equals(LaunchCore.Player_Name, ""))
|
|
|
|
- {
|
|
|
|
|
|
+ // 获取玩家名称输入框中的文本,并打印
|
|
|
|
+ LaunchCore.Player_Name = PlayerNameInput.getText();
|
|
|
|
+ System.out.println(LaunchCore.Player_Name);
|
|
|
|
+ // 获取最大内存设置值,并打印
|
|
|
|
+ System.out.println(SetMaxMem.getValue());
|
|
|
|
+ // 将最大内存设置值赋给LaunchCore类的Max_Mem字段
|
|
|
|
+ LaunchCore.Max_Mem = (int) SetMaxMem.getValue();
|
|
|
|
+
|
|
|
|
+ // 检查玩家名称是否为空
|
|
|
|
+ if (!Objects.equals(LaunchCore.Player_Name, "")){
|
|
|
|
+ // 获取版本选择框中选定的游戏版本,并打印
|
|
LaunchCore.Game_Version = VersionChoice.getSelectionModel().getSelectedItem();
|
|
LaunchCore.Game_Version = VersionChoice.getSelectionModel().getSelectedItem();
|
|
System.out.println("选择的游戏版本:"+LaunchCore.Game_Version);
|
|
System.out.println("选择的游戏版本:"+LaunchCore.Game_Version);
|
|
|
|
+
|
|
|
|
+ // 检查游戏版本是否已选择
|
|
if (!Objects.equals(LaunchCore.Game_Version, null)){
|
|
if (!Objects.equals(LaunchCore.Game_Version, null)){
|
|
|
|
+ // 获取Java环境设置文本框中的文本,并打印
|
|
LaunchCore.Java_Environment = SetJavaEnviroment.getText();
|
|
LaunchCore.Java_Environment = SetJavaEnviroment.getText();
|
|
|
|
+ // 获取全屏设置复选框的状态,并打印
|
|
System.out.println(SetFullScreen.isSelected());
|
|
System.out.println(SetFullScreen.isSelected());
|
|
LaunchCore.FullScreen_Set = SetFullScreen.isSelected();
|
|
LaunchCore.FullScreen_Set = SetFullScreen.isSelected();
|
|
|
|
+
|
|
|
|
+ // 检查游戏目录设置文本框中的文本是否与当前游戏目录不同
|
|
if(!Objects.equals(SetGameDirectory.getText(), LaunchCore.Game_Directory)){
|
|
if(!Objects.equals(SetGameDirectory.getText(), LaunchCore.Game_Directory)){
|
|
|
|
+ // 如果不同,更新游戏目录
|
|
LaunchCore.Game_Directory = SetGameDirectory.getText();
|
|
LaunchCore.Game_Directory = SetGameDirectory.getText();
|
|
}
|
|
}
|
|
|
|
+ // 打印游戏目录
|
|
System.out.println("游戏目录"+ LaunchCore.Game_Directory);
|
|
System.out.println("游戏目录"+ LaunchCore.Game_Directory);
|
|
|
|
+
|
|
|
|
+ // 尝试创建LaunchCore的新实例来启动游戏
|
|
try {
|
|
try {
|
|
new LaunchCore();
|
|
new LaunchCore();
|
|
} catch (IOException | LaunchException e) {
|
|
} catch (IOException | LaunchException e) {
|
|
|
|
+ // 如果出现IOException或LaunchException,抛出RuntimeException
|
|
throw new RuntimeException(e);
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
}else{
|
|
}else{
|
|
- showAlert("游戏版本不能为空");
|
|
|
|
- return;}
|
|
|
|
|
|
+ // 如果游戏版本未选择,显示警告对话框
|
|
|
|
+ showAlert("游戏版本不能为空");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
}else{
|
|
}else{
|
|
- showAlert("用户名不能为空");}
|
|
|
|
-
|
|
|
|
|
|
+ // 如果玩家名称为空,显示警告对话框
|
|
|
|
+ showAlert("用户名不能为空");
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 检查并确保根目录下存在 .minecraft 目录及其子目录 versions
|
|
|
|
+ * 如果这些目录不存在,将自动创建它们
|
|
|
|
+ */
|
|
private void CheckRootDirectory(){
|
|
private void CheckRootDirectory(){
|
|
// 获取程序的根目录
|
|
// 获取程序的根目录
|
|
String rootPath = System.getProperty("user.dir");
|
|
String rootPath = System.getProperty("user.dir");
|
|
@@ -104,6 +168,7 @@ public class HelloController {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
@FXML//刷新游戏文件夹按钮
|
|
@FXML//刷新游戏文件夹按钮
|
|
protected void ReloadGameDirectoryClick(){
|
|
protected void ReloadGameDirectoryClick(){
|
|
InitializeVersionChoice();
|
|
InitializeVersionChoice();
|
|
@@ -197,25 +262,41 @@ public class HelloController {
|
|
LaunchCore.Max_Mem = (int) SetMaxMem.getValue();
|
|
LaunchCore.Max_Mem = (int) SetMaxMem.getValue();
|
|
});
|
|
});
|
|
}
|
|
}
|
|
- private void InitializeJavaEnviroment(){
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 初始化Java环境方法
|
|
|
|
+ * 该方法主要用于检测当前系统的Java版本和安装路径,
|
|
|
|
+ * 并根据操作系统类型设置默认的Java执行文件路径
|
|
|
|
+ */
|
|
|
|
+ private void InitializeJavaEnviroment(){
|
|
// 获取Java版本
|
|
// 获取Java版本
|
|
String javaVersion = System.getProperty("java.version");
|
|
String javaVersion = System.getProperty("java.version");
|
|
// 获取Java安装路径
|
|
// 获取Java安装路径
|
|
String javaHome = System.getProperty("java.home");
|
|
String javaHome = System.getProperty("java.home");
|
|
|
|
+ // 设置Java版本信息显示文本
|
|
JavaVersion.setText("Java版本:"+javaVersion);
|
|
JavaVersion.setText("Java版本:"+javaVersion);
|
|
|
|
+
|
|
|
|
+ // 获取操作系统名称,并转换为小写以方便后续比较
|
|
String osName = System.getProperty("os.name").toLowerCase();
|
|
String osName = System.getProperty("os.name").toLowerCase();
|
|
|
|
+
|
|
|
|
+ // 根据操作系统类型设置默认Java执行文件路径
|
|
if (osName.contains("mac")) {
|
|
if (osName.contains("mac")) {
|
|
|
|
+ // 对于MacOS系统,设置MacOS下的默认Java路径
|
|
System.out.println("检测到系统为MacOS,设置默认Java路径");
|
|
System.out.println("检测到系统为MacOS,设置默认Java路径");
|
|
SetJavaEnviroment.setText(javaHome+"/bin/java");
|
|
SetJavaEnviroment.setText(javaHome+"/bin/java");
|
|
|
|
+ // 打印设置的Java路径以进行调试确认
|
|
System.out.println(SetJavaEnviroment.getText());
|
|
System.out.println(SetJavaEnviroment.getText());
|
|
} else if (osName.contains("win")) {
|
|
} else if (osName.contains("win")) {
|
|
|
|
+ // 对于Windows系统,设置Windows下的默认Java路径
|
|
System.out.println("检测到系统为Windows,设置默认Java路径");
|
|
System.out.println("检测到系统为Windows,设置默认Java路径");
|
|
SetJavaEnviroment.setText(javaHome+"/bin/java.exe");
|
|
SetJavaEnviroment.setText(javaHome+"/bin/java.exe");
|
|
|
|
+ // 打印设置的Java路径以进行调试确认
|
|
System.out.println(SetJavaEnviroment.getText());
|
|
System.out.println(SetJavaEnviroment.getText());
|
|
} else {
|
|
} else {
|
|
|
|
+ // 对于其他操作系统,简单打印提示信息
|
|
System.out.println("其他操作系统");
|
|
System.out.println("其他操作系统");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
private void DataSave(){
|
|
private void DataSave(){
|
|
|
|
|
|
}
|
|
}
|
|
@@ -256,6 +337,9 @@ public class HelloController {
|
|
@FXML
|
|
@FXML
|
|
private ChoiceBox<String> VersionChoice;//版本选择下拉框
|
|
private ChoiceBox<String> VersionChoice;//版本选择下拉框
|
|
|
|
|
|
|
|
+ @FXML
|
|
|
|
+ private ChoiceBox<String> LoginModeChoice;//登录方式选择下拉框
|
|
|
|
+
|
|
@FXML
|
|
@FXML
|
|
private ListView<String> MinecraftDownloadVersionList;
|
|
private ListView<String> MinecraftDownloadVersionList;
|
|
|
|
|