From 6b02dc3cd5c44e55bedb703d222e862f42d54c9a Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 6 Jun 2018 23:43:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=A4=9A=E4=B8=AA=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=E7=89=88=E6=9C=AC=E7=9A=84Java=E5=85=B1=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/game/LauncherHelper.java | 1 + .../hmcl/setting/VersionSetting.java | 32 ++++++++++++++++--- .../hmcl/ui/VersionSettingsController.java | 7 ++-- .../org/jackhuang/hmcl/util/JavaVersion.java | 10 ++---- 4 files changed, 37 insertions(+), 13 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 90f9730c9..280cc6332 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -181,6 +181,7 @@ public final class LauncherHelper { if (java == null) { Controllers.dialog(Launcher.i18n("launch.wrong_javadir"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); setting.setJava(null); + setting.setDefaultJavaPath(null); java = JavaVersion.fromCurrentEnvironment(); flag = true; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index 834ca4203..982d15673 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -26,7 +26,9 @@ import org.jackhuang.hmcl.util.*; import java.io.File; import java.io.IOException; import java.lang.reflect.Type; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; /** * @@ -87,6 +89,20 @@ public final class VersionSetting { javaProperty.set(java); } + private final ImmediateStringProperty defaultJavaPathProperty = new ImmediateStringProperty(this, "defaultJavaPath", ""); + + /** + * Path to Java executable, or null if user customizes java directory. + * It's used to determine which JRE to use when multiple JREs match the selected Java version. + */ + public String getDefaultJavaPath() { + return defaultJavaPathProperty.get(); + } + + public void setDefaultJavaPath(String defaultJavaPath) { + defaultJavaPathProperty.set(defaultJavaPath); + } + private final ImmediateStringProperty javaDirProperty = new ImmediateStringProperty(this, "javaDir", ""); public ImmediateStringProperty javaDirProperty() { @@ -444,12 +460,18 @@ public final class VersionSetting { return null; // Custom Java Directory not found, } } else if (StringUtils.isNotBlank(getJava())) { - JavaVersion c = JavaVersion.getJREs().get(getJava()); - if (c == null) { + List matchedJava = JavaVersion.getJREs().stream() + .filter(java -> java.getVersion().equals(getJava())) + .collect(Collectors.toList()); + if (matchedJava.isEmpty()) { setJava("Default"); return JavaVersion.fromCurrentEnvironment(); - } else - return c; + } else { + return matchedJava.stream() + .filter(java -> java.getBinary().toString().equals(getDefaultJavaPath())) + .findFirst() + .orElse(matchedJava.get(0)); + } } else throw new Error(); } @@ -535,6 +557,7 @@ public final class VersionSetting { obj.addProperty("gameDir", src.getGameDir()); obj.addProperty("launcherVisibility", src.getLauncherVisibility().ordinal()); obj.addProperty("gameDirType", src.getGameDirType().ordinal()); + obj.addProperty("defaultJavaPath", src.getDefaultJavaPath()); return obj; } @@ -571,6 +594,7 @@ public final class VersionSetting { vs.setShowLogs(Optional.ofNullable(obj.get("showLogs")).map(JsonElement::getAsBoolean).orElse(false)); vs.setLauncherVisibility(LauncherVisibility.values()[Optional.ofNullable(obj.get("launcherVisibility")).map(JsonElement::getAsInt).orElse(1)]); vs.setGameDirType(EnumGameDirectory.values()[Optional.ofNullable(obj.get("gameDirType")).map(JsonElement::getAsInt).orElse(0)]); + vs.setDefaultJavaPath(Optional.ofNullable(obj.get("defaultJavaPath")).map(JsonElement::getAsString).orElse(null)); return vs; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java index a62277b82..3510142dc 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java @@ -84,7 +84,7 @@ public final class VersionSettingsController { FXUtils.smoothScrolling(scroll); - Task.of(variables -> variables.set("list", JavaVersion.getJREs().values().stream().map(javaVersion -> + Task.of(variables -> variables.set("list", JavaVersion.getJREs().stream().map(javaVersion -> javaItem.createChildren(javaVersion.getVersion(), javaVersion.getBinary().getAbsolutePath(), javaVersion) ).collect(Collectors.toList()))).subscribe(Schedulers.javafx(), variables -> javaItem.loadChildren(variables.>get("list")) @@ -165,8 +165,11 @@ public final class VersionSettingsController { javaItem.setToggleSelectedListener(newValue -> { if (javaItem.isCustomToggle(newValue)) { versionSetting.setJava("Custom"); + versionSetting.setDefaultJavaPath(null); } else { - versionSetting.setJava(((JavaVersion) newValue.getUserData()).getVersion()); + JavaVersion java = (JavaVersion) newValue.getUserData(); + versionSetting.setJava(java.getVersion()); + versionSetting.setDefaultJavaPath(java.getBinary().toString()); } }); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java index 96dbe8e5a..036af9a88 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java @@ -162,10 +162,10 @@ public final class JavaVersion implements Serializable { Platform.PLATFORM ); - private static Map JAVAS; + private static List JAVAS; private static final CountDownLatch LATCH = new CountDownLatch(1); - public static Map getJREs() throws InterruptedException { + public static List getJREs() throws InterruptedException { if (JAVAS != null) return JAVAS; LATCH.await(); @@ -175,8 +175,6 @@ public final class JavaVersion implements Serializable { public static synchronized void initialize() throws IOException { if (JAVAS != null) throw new IllegalStateException("JavaVersions have already been initialized."); - HashMap temp = new HashMap<>(); - temp.put(THIS_JAVA.getVersion(), THIS_JAVA); List javaVersions; switch (OperatingSystem.CURRENT_OS) { case WINDOWS: @@ -192,9 +190,7 @@ public final class JavaVersion implements Serializable { javaVersions = Collections.emptyList(); break; } - for (JavaVersion v : javaVersions) - temp.put(v.getVersion(), v); - JAVAS = Collections.unmodifiableMap(temp); + JAVAS = Collections.unmodifiableList(javaVersions); LATCH.countDown(); }