From dd0cdb5c8332b282b3198888bdb858e7c09f0c34 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Thu, 18 Feb 2016 20:00:03 +0800 Subject: [PATCH] Fixed #26 --- .../hellominecraft/launcher/Launcher.java | 11 +++++++- .../hellominecraft/launcher/Main.java | 2 +- .../hellominecraft/launcher/ui/HeaderTab.java | 8 ++++++ .../launcher/ui/MainPagePanel.java | 4 +++ .../modpack/ModpackInitializationPanel.java | 2 +- .../launcher/ui/modpack/ModpackWizard.java | 1 - .../launcher/util/CrashReporter.java | 6 +++-- .../launcher/util/HMCLGameLauncher.java | 27 +++++++++++++------ .../hellominecraft/util/ui/SwingUtils.java | 11 ++++++++ .../api/displayer/WizardDisplayerImpl.java | 1 + 10 files changed, 59 insertions(+), 14 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java index 76e9624d2..5dc13833b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java @@ -31,6 +31,7 @@ import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.launcher.util.MinecraftCrashAdvicer; import org.jackhuang.hellominecraft.util.DoubleOutputStream; import org.jackhuang.hellominecraft.util.LauncherPrintStream; +import org.jackhuang.hellominecraft.util.Utils; /** * @@ -106,6 +107,7 @@ public final class Launcher { LOGGER.info("*** Launching Game ***"); + int flag = 0; try { minecraftMain.invoke(null, new Object[] { (String[]) cmdList.toArray(new String[cmdList.size()]) }); } catch (Throwable throwable) { @@ -113,8 +115,15 @@ public final class Launcher { System.err.println(C.i18n("crash.minecraft")); System.err.println(MinecraftCrashAdvicer.getAdvice(trace)); System.err.println(trace); + flag = 1; } - LOGGER.info("*** Game exited ***"); + LOGGER.info("*** Game Exited ***"); + + try { + Utils.shutdownForcely(flag); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to shut down this process...", e); + } } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index a2bda5a4a..12cdcdba9 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -123,7 +123,7 @@ public final class Main implements Runnable { return; System.setProperty("sun.java2d.noddraw", "true"); - System.setProperty("sun.java2d.apiaware", "false"); + System.setProperty("sun.java2d.dpiaware", "false"); Thread.setDefaultUncaughtExceptionHandler(new CrashReporter(true)); try { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/HeaderTab.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/HeaderTab.java index f05e6860f..54cb65370 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/HeaderTab.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/HeaderTab.java @@ -82,23 +82,31 @@ public class HeaderTab extends JLabel @Override public void mousePressed(MouseEvent e) { + if (!isEnabled()) + return; this.model.setPressed(true); this.model.setArmed(true); } @Override public void mouseReleased(MouseEvent e) { + if (!isEnabled()) + return; this.model.setPressed(false); this.model.setArmed(false); } @Override public void mouseEntered(MouseEvent e) { + if (!isEnabled()) + return; this.model.setRollover(true); } @Override public void mouseExited(MouseEvent e) { + if (!isEnabled()) + return; this.model.setRollover(false); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java index 1b0ded4f1..ed0ed6fc4 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java @@ -43,6 +43,7 @@ import org.jackhuang.hellominecraft.lookandfeel.comp.ConstomButton; import org.jackhuang.hellominecraft.util.func.Consumer; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; +import org.jackhuang.hellominecraft.util.ui.SwingUtils; import org.jackhuang.hellominecraft.util.ui.wizard.api.WizardDisplayer; /** @@ -501,6 +502,8 @@ public class MainPagePanel extends AnimatedPanel { isLoading = false; } + final Consumer launchingStateChanged = t -> SwingUtils.setEnabled(MainFrame.INSTANCE.getRootPane(), !t); + final Consumer versionChanged = this::versionChanged; void versionChanged(String selectedVersion) { @@ -513,6 +516,7 @@ public class MainPagePanel extends AnimatedPanel { final Consumer onSelectedProfilesChanged = t -> { t.service().version().onRefreshedVersions.register(onRefreshedVersions); t.selectedVersionChangedEvent.register(versionChanged); + t.launcher().launchingStateChanged.register(launchingStateChanged); ((DefaultComboBoxModel) cboProfiles.getModel()).setSelectedItem(t.getName()); }; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java index b09da138a..afeba8aa5 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java @@ -206,7 +206,7 @@ public class ModpackInitializationPanel extends javax.swing.JPanel { wizardData.put(KEY_INCLUDING_LAUNCHER, chkIncludeLauncher.isSelected()); }//GEN-LAST:event_chkIncludeLauncherItemStateChanged - static final Pattern PATTERN = Pattern.compile("[-a-zA-Z0-9_\\.\u4E00-\u9FA5]+$"); + static final Pattern PATTERN = Pattern.compile("[-a-zA-Z0-9_\\.\\(\\)\\[\\]\\{\\}\\<\\>\"\'\u4E00-\u9FA5]+$"); void checkProblem() { controller.setProblem(null); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java index 4b12a1167..5abef9828 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java @@ -37,7 +37,6 @@ import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.Pair; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.Utils; -import org.jackhuang.hellominecraft.util.func.CallbackIO; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.system.ZipEngine; import org.jackhuang.hellominecraft.util.ui.WebPage; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java index ec14b61bd..7f1ef4ef6 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java @@ -131,7 +131,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { if (THROWABLE_SET.contains(stacktrace)) return; THROWABLE_SET.add(stacktrace); - new Thread(() -> { + Thread t = new Thread(() -> { HashMap map = new HashMap<>(); map.put("CrashReport", text); try { @@ -139,7 +139,9 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { } catch (IOException ex) { LOGGER.log(Level.SEVERE, "Failed to post HMCL server.", ex); } - }).start(); + }); + t.setDaemon(true); + t.start(); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLGameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLGameLauncher.java index ccf45d123..adb69233f 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLGameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLGameLauncher.java @@ -29,6 +29,7 @@ import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions; import org.jackhuang.hellominecraft.launcher.setting.Profile; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.util.C; +import org.jackhuang.hellominecraft.util.EventHandler; import org.jackhuang.hellominecraft.util.func.Consumer; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -41,31 +42,39 @@ public class HMCLGameLauncher { Profile profile; boolean isLaunching = false; + public final EventHandler launchingStateChanged = new EventHandler<>(this); + public HMCLGameLauncher(Profile p) { this.profile = p; } + void setLaunching(boolean isLaunching) { + if (isLaunching != this.isLaunching) + launchingStateChanged.execute(isLaunching); + this.isLaunching = isLaunching; + } + public void genLaunchCode(final Consumer listener, final Consumer failed, String passwordIfNeeded) { if (isLaunching || profile == null) return; - isLaunching = true; + setLaunching(true); HMCLog.log("Start generating launching command..."); File file = profile.getCanonicalGameDirFile(); if (!file.exists()) { failed.accept(C.i18n("minecraft.wrong_path")); - isLaunching = false; + setLaunching(false); return; } if (profile.getSelectedVersion() == null) { failed.accept(C.i18n("minecraft.no_selected_version")); - isLaunching = false; + setLaunching(false); return; } final IAuthenticator l = IAuthenticator.LOGINS.get(Settings.getInstance().getLoginType()); final LoginInfo li = new LoginInfo(l.getUserName(), l.isLoggedIn() || !l.hasPassword() ? null : passwordIfNeeded); - new Thread() { + Thread t = new Thread() { @Override public void run() { Thread.currentThread().setName("Game Launcher"); @@ -74,18 +83,20 @@ public class HMCLGameLauncher { PluginManager.plugin().onProcessingLaunchOptions(options); DefaultGameLauncher gl = new DefaultGameLauncher(options, profile.service(), li, l); gl.setTag(profile.getSelectedVersionSetting().getLauncherVisibility()); - gl.successEvent.register(() -> isLaunching = false); + gl.successEvent.register(() -> setLaunching(false)); listener.accept(gl); gl.makeLaunchCommand(); } catch (GameException e) { failed.accept(C.i18n("launch.failed") + ", " + e.getMessage()); - isLaunching = false; + setLaunching(false); } catch (AuthenticationException e) { failed.accept(C.i18n("login.failed") + ", " + e.getMessage()); - isLaunching = false; + setLaunching(false); } } - }.start(); + }; + t.setDaemon(true); + t.start(); } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java index f501c865e..dae0d14d8 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hellominecraft.util.ui; +import java.awt.Component; import java.awt.EventQueue; import java.awt.FontMetrics; import java.io.File; @@ -27,6 +28,7 @@ import java.util.HashMap; import java.util.Map; import javax.swing.DefaultListModel; import javax.swing.JComboBox; +import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; @@ -265,4 +267,13 @@ public class SwingUtils { return -1; return ((JComboBox) msgs[1]).getSelectedIndex(); } + + public static void setEnabled(JComponent component, boolean t) { + synchronized (component.getTreeLock()) { + for (Component c : component.getComponents()) + if (c instanceof JComponent) + setEnabled((JComponent) c, t); + } + component.setEnabled(t); + } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java index 9ff809a38..790f2b1d4 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java @@ -460,6 +460,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { } }; Thread runner = new Thread(run, "Wizard Background Result Thread " + r); + runner.setDaemon(true); runner.start(); }