From fe922e0bed6d1d7bc0d29ab3a26ade8bc095f47b Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Wed, 4 Aug 2021 01:52:16 +0800 Subject: [PATCH] fix: Check whether java 16 is chosen when launching 1.17 and javaVersion is not defined in version json. --- .../jackhuang/hmcl/game/LauncherHelper.java | 36 +++++++++++++++++-- .../org/jackhuang/hmcl/ui/Controllers.java | 5 +++ .../hmcl/ui/construct/MessageDialogPane.java | 14 ++++++++ .../resources/assets/lang/I18N.properties | 1 + .../assets/lang/I18N_zh_CN.properties | 1 + 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 41b8ea576..660ace369 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.game; +import com.jfoenix.controls.JFXButton; import javafx.application.Platform; import javafx.stage.Stage; import org.jackhuang.hmcl.Launcher; @@ -47,6 +48,7 @@ import org.jackhuang.hmcl.setting.VersionSetting; import org.jackhuang.hmcl.task.*; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.DialogController; +import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.LogWindow; import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType; @@ -326,7 +328,11 @@ public final class LauncherHelper { if (acceptableJava.isPresent()) { setting.setJavaVersion(acceptableJava.get()); } else { - Controllers.confirm(i18n("launch.advice.require_newer_java_version", gameVersion.toString(), version.getJavaVersion().getMajorVersion()), i18n("message.warning"), () -> { + JFXButton linkButton = new JFXButton(i18n("download.external_link")); + linkButton.setOnAction(e -> FXUtils.openLink("https://adoptopenjdk.net/")); + linkButton.getStyleClass().add("dialog-accept"); + JFXButton yesButton = new JFXButton(i18n("button.ok")); + yesButton.setOnAction(event -> { downloadJava(version.getJavaVersion(), profile) .thenAcceptAsync(x -> { try { @@ -338,12 +344,38 @@ public final class LauncherHelper { LOG.log(Level.SEVERE, "Cannot list javas", e); } }, Platform::runLater).thenAccept(x -> onAccept.run()); - }, null); + }); + yesButton.getStyleClass().add("dialog-accept"); + JFXButton noButton = new JFXButton(i18n("button.cancel")); + noButton.getStyleClass().add("dialog-cancel"); + + Controllers.dialogWithButtons( + i18n("launch.advice.require_newer_java_version", + gameVersion.toString(), + version.getJavaVersion().getMajorVersion()), + i18n("message.warning"), + MessageType.QUESTION, + linkButton, yesButton, noButton); flag = true; } } } + // Game later than 1.17 requires Java 16. + if (!flag && java.getParsedVersion() < JavaVersion.JAVA_16 && gameVersion.compareTo(VersionNumber.asVersion("1.17")) >= 0) { + Optional acceptableJava = JavaVersion.getJavas().stream() + .filter(javaVersion -> javaVersion.getParsedVersion() >= JavaVersion.JAVA_16) + .max(Comparator.comparing(JavaVersion::getVersionNumber)); + if (acceptableJava.isPresent()) { + setting.setJavaVersion(acceptableJava.get()); + } else { + Controllers.confirm(i18n("launch.advice.require_newer_java_version", gameVersion.toString(), 16), i18n("message.warning"), () -> { + FXUtils.openLink("https://adoptopenjdk.net/"); + }, null); + } + flag = true; + } + // Game later than 1.7.2 accepts Java 8. if (!flag && java.getParsedVersion() < JavaVersion.JAVA_8 && gameVersion.compareTo(VersionNumber.asVersion("1.7.2")) > 0) { Optional java8 = JavaVersion.getJavas().stream() diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index 1ba814a05..085f33066 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.ui; +import com.jfoenix.controls.JFXButton; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.scene.Node; @@ -205,6 +206,10 @@ public final class Controllers { dialog(new MessageDialogPane(text, title, type, onAccept, onCancel)); } + public static void dialogWithButtons(String text, String title, MessageType type, JFXButton... buttons) { + dialog(MessageDialogPane.fromButtons(text, title, type, buttons)); + } + public static CompletableFuture prompt(String title, FutureCallback onResult) { return prompt(title, onResult, ""); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java index 513fb29ea..cf8141f9e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java @@ -20,6 +20,7 @@ package org.jackhuang.hmcl.ui.construct; import com.jfoenix.controls.JFXButton; import javafx.fxml.FXML; import javafx.scene.control.Label; +import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.setting.Theme; @@ -102,4 +103,17 @@ public final class MessageDialogPane extends StackPane { actions.getChildren().add(cancelButton); } + + public static MessageDialogPane fromButtons(String text, String title, MessageType type, JFXButton[] buttons) { + MessageDialogPane pane = new MessageDialogPane(text, title, type, null); + + for (JFXButton button : buttons) { + button.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { + pane.fireEvent(new DialogCloseEvent()); + }); + } + + pane.actions.getChildren().setAll(buttons); + return pane; + } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index d757958bd..550d45079 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -168,6 +168,7 @@ curse.sort.total_downloads=Total Downloads download=Download download.code.404=File not found on the remote server: %s +download.external_link=Open Download Site download.failed=Failed to download %1$s, response code: %2$d download.failed.empty=No candidates. Click here to return. download.failed.refresh=Unable to download version list. Click here to retry. diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 0330270c3..92dcf25a9 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -168,6 +168,7 @@ curse.sort.total_downloads=下载量 download=下载 download.code.404=远程服务器不包含需要下载的文件: %s +download.external_link=打开下载网站 download.failed=下载失败: %1$s,错误码:%2$d download.failed.empty=没有可供安装的版本,点击此处返回。 download.failed.refresh=加载版本列表失败,点击此处重试。