From 41dbdfc0161e4108ca7c7d8bf06784b361914400 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Tue, 27 Feb 2018 19:58:43 +0800 Subject: [PATCH] Fix NullPointerException when refreshing versions again --- .../org/jackhuang/hmcl/setting/Settings.java | 4 +-- .../java/org/jackhuang/hmcl/ui/MainPage.java | 28 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 93f8d2cc2..ef22ca06b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -530,8 +530,8 @@ public class Settings { } private void onProfileChanged() { - getSelectedProfile().getRepository().refreshVersionsAsync().subscribe(() -> - EventBus.EVENT_BUS.fireEvent(new ProfileChangedEvent(SETTINGS, getSelectedProfile()))); + EventBus.EVENT_BUS.fireEvent(new ProfileChangedEvent(SETTINGS, getSelectedProfile())); + getSelectedProfile().getRepository().refreshVersionsAsync().start(); } private void profileNameChanged(ObservableValue observableValue, String oldValue, String newValue) { 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 c2f24ab1b..75ef46570 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -17,11 +17,11 @@ */ package org.jackhuang.hmcl.ui; +import com.jfoenix.concurrency.JFXUtilities; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXListView; import com.jfoenix.controls.JFXMasonryPane; import com.jfoenix.controls.JFXPopup; -import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.fxml.FXML; @@ -33,7 +33,6 @@ import javafx.stage.FileChooser; import org.jackhuang.hmcl.Main; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.ProfileChangedEvent; -import org.jackhuang.hmcl.event.ProfileLoadingEvent; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; import org.jackhuang.hmcl.game.*; import org.jackhuang.hmcl.mod.MismatchedModpackTypeException; @@ -79,7 +78,11 @@ public final class MainPage extends StackPane implements DecoratorPage { { FXUtils.loadFXML(this, "/assets/fxml/main.fxml"); - EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).register(() -> Platform.runLater(this::loadVersions)); + EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).register(event -> { + if (event.getSource() == profile.getRepository()) + loadVersions((HMCLGameRepository) event.getSource()); + }); + EventBus.EVENT_BUS.channel(ProfileChangedEvent.class).register(event -> this.profile = event.getProfile()); versionPopup = new JFXPopup(versionList); getChildren().remove(versionList); @@ -90,14 +93,14 @@ public final class MainPage extends StackPane implements DecoratorPage { FXUtils.installTooltip(btnRefresh, Main.i18n("button.refresh")); } - private Node buildNode(Profile profile, String version, String game) { + private Node buildNode(HMCLGameRepository repository, String version, String game) { VersionItem item = new VersionItem(); - item.setUpdate(profile.getRepository().isModpack(version)); + item.setUpdate(repository.isModpack(version)); item.setGameVersion(game); item.setVersionName(version); StringBuilder libraries = new StringBuilder(); - for (Library library : profile.getRepository().getVersion(version).getLibraries()) { + for (Library library : repository.getVersion(version).getLibraries()) { if (library.getGroupId().equalsIgnoreCase("net.minecraftforge") && library.getArtifactId().equalsIgnoreCase("forge")) { libraries.append(Main.i18n("install.installer.forge")).append(": ").append(StringUtils.removeSuffix(StringUtils.removePrefix(library.getVersion().replaceAll("(?i)forge", "").replace(game, "").trim(), "-"), "-")).append("\n"); } @@ -176,17 +179,12 @@ public final class MainPage extends StackPane implements DecoratorPage { return item; } - private void loadVersions() { - loadVersions(Settings.INSTANCE.getSelectedProfile()); - } - - private void loadVersions(Profile profile) { - this.profile = profile; + private void loadVersions(HMCLGameRepository repository) { List children = new LinkedList<>(); - for (Version version : profile.getRepository().getVersions()) { - children.add(buildNode(profile, version.getId(), GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version.getId())).orElse("Unknown"))); + for (Version version : repository.getVersions()) { + children.add(buildNode(repository, version.getId(), GameVersion.minecraftVersion(repository.getVersionJar(version.getId())).orElse("Unknown"))); } - FXUtils.resetChildren(masonryPane, children); + JFXUtilities.runInFX(() -> FXUtils.resetChildren(masonryPane, children)); } @FXML