From 2c7510fe5f76cd891689949d6d7a46b2b9850852 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sat, 27 Jan 2018 16:16:38 +0800 Subject: [PATCH] Crash and upgrade --- .../main/java/org/jackhuang/hmcl/Main.java | 19 ++- .../org/jackhuang/hmcl/setting/Locales.java | 1 + .../org/jackhuang/hmcl/ui/AccountsPage.java | 1 + .../org/jackhuang/hmcl/ui/Controllers.java | 4 + .../org/jackhuang/hmcl/ui/CrashWindow.java | 72 +++++++++++ .../java/org/jackhuang/hmcl/ui/Decorator.java | 9 ++ .../java/org/jackhuang/hmcl/ui/FXUtils.java | 22 ++++ .../jackhuang/hmcl/ui/LeftPaneController.java | 6 +- .../java/org/jackhuang/hmcl/ui/MainPage.java | 5 +- .../hmcl/upgrade/AppDataUpgrader.java | 11 +- .../hmcl/upgrade/NewFileUpgrader.java | 2 +- .../jackhuang/hmcl/upgrade/UpdateChecker.java | 2 +- .../jackhuang/hmcl/util/CrashReporter.java | 121 ++++++++++++++++++ .../main/resources/assets/fxml/account.fxml | 17 +-- .../main/resources/assets/fxml/decorator.fxml | 5 + .../assets/fxml/version/version-settings.fxml | 2 +- .../assets/fxml/yggdrasil-account-login.fxml | 2 +- .../resources/assets/lang/I18N.properties | 26 ++-- .../assets/lang/I18N_zh_CN.properties | 23 ++-- .../java/org/jackhuang/hmcl/util/Lang.java | 1 + 20 files changed, 293 insertions(+), 58 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index 52bc84a5f..eadf885b8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -23,10 +23,14 @@ import javafx.application.Platform; import javafx.stage.Stage; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; +import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.Controllers; +import org.jackhuang.hmcl.upgrade.IUpgrader; +import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.util.*; import java.io.File; +import java.util.Arrays; import java.util.ResourceBundle; import java.util.logging.Level; @@ -44,8 +48,17 @@ public final class Main extends Application { } public static void main(String[] args) { - NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher"); + Thread.setDefaultUncaughtExceptionHandler(new CrashReporter()); + + // NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher"); Constants.UI_THREAD_SCHEDULER = Constants.JAVAFX_UI_THREAD_SCHEDULER; + IUpgrader.NOW_UPGRADER.parseArguments(VersionNumber.asVersion(VERSION), Arrays.asList(args)); + + Logging.LOG.info("*** " + TITLE + " ***"); + + UPDATE_CHECKER.process(false) + .then(Task.of(Controllers::showUpdate)) + .start(); launch(args); } @@ -99,4 +112,8 @@ public final class Main extends Application { public static final String TITLE = NAME + " " + VERSION; public static final File APPDATA = getWorkingDirectory("hmcl"); public static final ResourceBundle RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle(); + public static final UpdateChecker UPDATE_CHECKER = new UpdateChecker(VersionNumber.asVersion(VERSION), "hmcl"); + + public static final String CONTACT = "http://huangyuhui.duapp.com/hmcl.php"; + public static final String PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Locales.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Locales.java index 275bb2e9d..a42894ff8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Locales.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Locales.java @@ -61,6 +61,7 @@ public final class Locales { } public static SupportedLocale getLocaleByName(String name) { + if (name == null) return DEFAULT; switch (name.toLowerCase()) { case "en": return EN; case "zh": return ZH; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java index fc0d57d2b..57c41e161 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java @@ -68,6 +68,7 @@ public final class AccountsPage extends StackPane implements DecoratorPage { FXUtils.setValidateWhileTextChanged(txtUsername); FXUtils.setValidateWhileTextChanged(txtPassword); + cboType.getItems().setAll(Main.i18n("account.methods.offline"), Main.i18n("account.methods.yggdrasil")); cboType.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> { txtPassword.setVisible(newValue.intValue() != 0); }); 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 d36f4d3b6..0a569b2f2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -139,4 +139,8 @@ public final class Controllers { public static void navigate(Node node) { decorator.showPage(node); } + + public static void showUpdate() { + + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java new file mode 100644 index 000000000..7dc7d7122 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java @@ -0,0 +1,72 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2017 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.ui; + +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextArea; +import javafx.scene.image.Image; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; +import org.jackhuang.hmcl.Main; + +/** + * @author huangyuhui + */ +public class CrashWindow extends Stage { + + private Label lblCrash = new Label(); + private Button btnContact = new Button(); + private TextArea textArea = new TextArea(); + + public CrashWindow(String text) { + if (Main.UPDATE_CHECKER.isOutOfDate()) + lblCrash.setText(Main.i18n("launcher.crash_out_dated")); + else + lblCrash.setText(Main.i18n("launcher.crash")); + lblCrash.setWrapText(true); + + textArea.setText(text); + textArea.setEditable(false); + + btnContact.setText(Main.i18n("launcher.contact")); + btnContact.setOnMouseClicked(event -> FXUtils.openLink(Main.CONTACT)); + HBox box = new HBox(); + box.setStyle("-fx-padding: 8px;"); + box.getChildren().add(btnContact); + box.setAlignment(Pos.CENTER_RIGHT); + + BorderPane pane = new BorderPane(); + StackPane stackPane = new StackPane(); + stackPane.setStyle("-fx-padding: 8px;"); + stackPane.getChildren().add(lblCrash); + pane.setTop(stackPane); + pane.setCenter(textArea); + pane.setBottom(box); + + Scene scene = new Scene(pane, 800, 480); + setScene(scene); + getIcons().add(new Image("/assets/img/icon.png")); + setTitle(Main.i18n("message.error")); + } + +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index 76b8616d3..bb38f350e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -118,6 +118,8 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza private JFXButton btnMax; @FXML private JFXButton btnClose; + @FXML + private HBox updatePane; public Decorator(Stage primaryStage, Node mainPage, String title) { this(primaryStage, mainPage, title, true, true); @@ -131,6 +133,9 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza FXUtils.loadFXML(this, "/assets/fxml/decorator.fxml"); + updatePane.setCursor(Cursor.HAND); + updatePane.setOnMouseClicked(event -> Main.UPDATE_CHECKER.checkOutdate()); + primaryStage.initStyle(StageStyle.UNDECORATED); btnClose.setGraphic(close); btnMin.setGraphic(minus); @@ -374,6 +379,10 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza } } + public void showUpdate() { + updatePane.setVisible(true); + } + private void setContent(Node content, AnimationProducer animation) { animationHandler.setContent(content, animation); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index ea9592038..e6937fac5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -48,6 +48,7 @@ import org.jackhuang.hmcl.util.OperatingSystem; import java.io.File; import java.io.IOException; +import java.net.URI; import java.util.List; import java.util.Optional; import java.util.function.Consumer; @@ -203,6 +204,27 @@ public final class FXUtils { } } + /** + * Open URL by java.awt.Desktop + * + * @param link null is allowed but will be ignored + */ + public static void openLink(String link) { + if (link == null) + return; + try { + java.awt.Desktop.getDesktop().browse(new URI(link)); + } catch (Throwable e) { + if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX) + try { + Runtime.getRuntime().exec(new String[] { "/usr/bin/open", link }); + } catch (IOException ex) { + Logging.LOG.log(Level.WARNING, "Unable to open link: " + link, ex); + } + Logging.LOG.log(Level.WARNING, "Failed to open link: " + link, e); + } + } + public static void bindInt(JFXTextField textField, Property property) { textField.textProperty().unbind(); textField.textProperty().bindBidirectional((Property) property, SafeIntStringConverter.INSTANCE); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java index f30c6a8c8..ba9e6976c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java @@ -40,7 +40,7 @@ import java.util.Objects; public final class LeftPaneController { private final AdvancedListBox leftPane; private final VBox profilePane = new VBox(); - private final VersionListItem accountItem = new VersionListItem("No Account", "unknown"); + private final VersionListItem accountItem = new VersionListItem("", ""); public LeftPaneController(AdvancedListBox leftPane) { this.leftPane = leftPane; @@ -67,8 +67,8 @@ public final class LeftPaneController { FXUtils.onChangeAndOperate(Settings.INSTANCE.selectedAccountProperty(), it -> { if (it == null) { - accountItem.setVersionName("mojang@mojang.com"); - accountItem.setGameVersion("Yggdrasil"); + accountItem.setVersionName(Main.i18n("account.missing")); + accountItem.setGameVersion(Main.i18n("message.unknown")); } else { accountItem.setVersionName(it.getUsername()); accountItem.setGameVersion(AccountsPage.accountType(it)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index 75eb5f6e4..49b1fa32b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -48,7 +48,6 @@ import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.construct.MessageBox; -import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; import org.jackhuang.hmcl.ui.download.DownloadWizardProvider; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; @@ -104,13 +103,13 @@ public final class MainPage extends StackPane implements DecoratorPage { item.setVersionName(version); item.setOnLaunchButtonClicked(e -> { if (Settings.INSTANCE.getSelectedAccount() == null) - Controllers.dialog(Main.i18n("login.no_Player007")); + Controllers.dialog(Main.i18n("login.empty_username")); else LauncherHelper.INSTANCE.launch(version, null); }); item.setOnScriptButtonClicked(e -> { if (Settings.INSTANCE.getSelectedAccount() == null) - Controllers.dialog(Main.i18n("login.no_Player007")); + Controllers.dialog(Main.i18n("login.empty_username")); else { FileChooser chooser = new FileChooser(); chooser.setInitialDirectory(profile.getRepository().getRunDirectory(version)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java index 3528dc922..8b7726da5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java @@ -106,7 +106,7 @@ public class AppDataUpgrader extends IUpgrader { String hash = null; if (map.containsKey("jarsha1")) hash = map.get("jarsha1"); - Controllers.dialog(Main.i18n("ui.message.downloading")); + Controllers.dialog(Main.i18n("message.downloading")); if (new AppDataUpgraderJarTask(NetworkUtils.toURL(map.get("jar")), version.toString(), hash).test()) { new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderJarTask.getSelf(version.toString()).getAbsolutePath()) .directory(new File("").getAbsoluteFile()).start(); @@ -121,7 +121,7 @@ public class AppDataUpgrader extends IUpgrader { String hash = null; if (map.containsKey("packsha1")) hash = map.get("packsha1"); - Controllers.dialog(Main.i18n("ui.message.downloading")); + Controllers.dialog(Main.i18n("message.downloading")); if (new AppDataUpgraderPackGzTask(NetworkUtils.toURL(map.get("pack")), version.toString(), hash).test()) { new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderPackGzTask.getSelf(version.toString()).getAbsolutePath()) .directory(new File("").getAbsoluteFile()).start(); @@ -132,14 +132,14 @@ public class AppDataUpgrader extends IUpgrader { Logging.LOG.log(Level.SEVERE, "Failed to create upgrader", ex); } else { - String url = URL_PUBLISH; + String url = Main.PUBLISH; if (map != null) if (map.containsKey(OperatingSystem.CURRENT_OS.getCheckedName())) url = map.get(OperatingSystem.CURRENT_OS.getCheckedName()); else if (map.containsKey(OperatingSystem.UNKNOWN.getCheckedName())) url = map.get(OperatingSystem.UNKNOWN.getCheckedName()); if (url == null) - url = URL_PUBLISH; + url = Main.PUBLISH; try { java.awt.Desktop.getDesktop().browse(new URI(url)); } catch (URISyntaxException | IOException e) { @@ -240,7 +240,4 @@ public class AppDataUpgrader extends IUpgrader { } } - - public static final String URL_PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; - public static final String URL_CONTACT = "http://huangyuhui.duapp.com/hmcl.php"; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java index 0aa1033f5..2ed95ba26 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java @@ -51,7 +51,7 @@ public class NewFileUpgrader extends IUpgrader { URL url = requestDownloadLink(); if (url == null) return; File newf = new File(url.getFile()); - Controllers.dialog(Main.i18n("ui.message.downloading")); + Controllers.dialog(Main.i18n("message.downloading")); if (new FileDownloadTask(url, newf).test()) { try { new ProcessBuilder(newf.getCanonicalPath(), "--removeOldLauncher", getRealPath()) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index 00767aeff..7580681ff 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -75,7 +75,7 @@ public final class UpdateChecker { } if (value == null) { - Logging.LOG.warning("Failed to check update..."); + Logging.LOG.warning("Unable to check update..."); if (showMessage) MessageBox.show(Main.i18n("update.failed")); } else if (base.compareTo(value) < 0) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java new file mode 100644 index 000000000..a511e5291 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java @@ -0,0 +1,121 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2017 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.util; + +import javafx.application.Platform; +import org.jackhuang.hmcl.Main; +import org.jackhuang.hmcl.ui.CrashWindow; +import org.jackhuang.hmcl.ui.construct.MessageBox; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.logging.Level; + +/** + * @author huangyuhui + */ +public class CrashReporter implements Thread.UncaughtExceptionHandler { + + private static final HashMap SOURCE = new HashMap() { + { + put("UnsatisfiedLinkError", Main.i18n("crash.user_fault")); + put("java.lang.NoClassDefFoundError", Main.i18n("crash.NoClassDefFound")); + put("java.lang.VerifyError", Main.i18n("crash.NoClassDefFound")); + put("java.lang.NoSuchMethodError", Main.i18n("crash.NoClassDefFound")); + put("java.lang.IncompatibleClassChangeError", Main.i18n("crash.NoClassDefFound")); + put("java.lang.ClassFormatError", Main.i18n("crash.NoClassDefFound")); + put("java.lang.OutOfMemoryError", "FUCKING MEMORY LIMIT!"); + put("Trampoline", Main.i18n("launcher.update_java")); + put("NoSuchAlgorithmException", "Has your operating system been installed completely or is a ghost system?"); + } + }; + + private boolean checkThrowable(Throwable e) { + String s = StringUtils.getStackTrace(e); + for (HashMap.Entry entry : SOURCE.entrySet()) + if (s.contains(entry.getKey())) { + if (StringUtils.isNotBlank(entry.getValue())) { + String info = entry.getValue(); + Logging.LOG.severe(info); + try { + MessageBox.show(info); + } catch (Throwable t) { + Logging.LOG.log(Level.SEVERE, "Unable to show message", t); + } + } + return false; + } + return true; + } + + @Override + public void uncaughtException(Thread t, Throwable e) { + String s = StringUtils.getStackTrace(e); + if (!s.contains("org.jackhuang")) + return; + + try { + StringBuilder builder = new StringBuilder(); + builder.append("---- Hello Minecraft! Crash Report ----\n"); + builder.append(" Version: " + Main.VERSION + "\n"); + builder.append(" Time: ").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).append("\n"); + builder.append(" Thread: ").append(t.toString()).append("\n"); + builder.append("\n Content: \n "); + builder.append(s).append("\n\n"); + builder.append("-- System Details --\n"); + builder.append(" Operating System: ").append(OperatingSystem.SYSTEM_VERSION).append("\n"); + builder.append(" Java Version: ").append(System.getProperty("java.version")).append(", ").append(System.getProperty("java.vendor")).append("\n"); + builder.append(" Java VM Version: ").append(System.getProperty("java.vm.name")).append(" (").append(System.getProperty("java.vm.info")).append("), ").append(System.getProperty("java.vm.vendor")).append("\n"); + String text = builder.toString(); + + Logging.LOG.log(Level.SEVERE, text); + + if (checkThrowable(e) && !System.getProperty("java.vm.name").contains("OpenJDK")) { + Platform.runLater(() -> new CrashWindow(text).show()); + if (!Main.UPDATE_CHECKER.isOutOfDate()) + reportToServer(text, s); + } + } catch (Throwable ex) { + Logging.LOG.log(Level.SEVERE, "Unable to caught exception", ex); + Logging.LOG.log(Level.SEVERE, "There is the original exception", e); + } + } + + private static final HashSet THROWABLE_SET = new HashSet<>(); + + private void reportToServer(final String text, String stacktrace) { + if (THROWABLE_SET.contains(stacktrace) || stacktrace.contains("Font") || stacktrace.contains("InternalError")) + return; + THROWABLE_SET.add(stacktrace); + Thread t = new Thread(() -> { + HashMap map = new HashMap<>(); + map.put("crash_report", text); + map.put("version", Main.VERSION); + try { + NetworkUtils.doPost(NetworkUtils.toURL("http://huangyuhui.duapp.com/hmcl/crash.php"), map); + } catch (IOException ex) { + Logging.LOG.log(Level.SEVERE, "Unable to post HMCL server.", ex); + } + }); + t.setDaemon(true); + t.start(); + } +} diff --git a/HMCL/src/main/resources/assets/fxml/account.fxml b/HMCL/src/main/resources/assets/fxml/account.fxml index cf0cafeb6..6bb350441 100644 --- a/HMCL/src/main/resources/assets/fxml/account.fxml +++ b/HMCL/src/main/resources/assets/fxml/account.fxml @@ -26,7 +26,7 @@ - + @@ -34,24 +34,17 @@ -