diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameSettingsPanel.java index 867275d3a..d139e4a72 100755 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameSettingsPanel.java @@ -250,7 +250,7 @@ public final class GameSettingsPanel extends RepaintPage implements DropTargetLi public void stateChanged(ChangeEvent e) { if (tabVersionEdit.getSelectedComponent() == pnlAutoInstall && !b) { b = true; - TaskWindow.factory().execute(installerPanels[0].refreshVersionsTask()); + installerPanels[0].refreshVersions(); } } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerPanel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerPanel.java index 61eb575ba..32eff4647 100755 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerPanel.java @@ -116,19 +116,19 @@ public class InstallerPanel extends Page { }//GEN-LAST:event_btnInstallActionPerformed private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshActionPerformed - TaskWindow.factory().execute(refreshVersionsTask()); + refreshVersions(); }//GEN-LAST:event_btnRefreshActionPerformed transient List versions; InstallerVersionList list; InstallerType id; - Task refreshVersionsTask() { + void refreshVersions() { + DefaultTableModel model = SwingUtils.clearDefaultTable(lstInstallers); + model.addRow(new Object[] { C.i18n("message.loading"), "", "" }); Task t = list.refresh(new String[] { gsp.getMinecraftVersionFormatted() }); if (t != null) - return t.with(new TaskRunnable(this::loadVersions)); - else - return null; + t.with(new TaskRunnable(this::loadVersions)).runAsync(); } public synchronized InstallerVersionList.InstallerVersion getVersion(int idx) { @@ -143,7 +143,7 @@ public class InstallerPanel extends Page { } TaskWindow.factory() .append(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id)) - .append(refreshVersionsTask()) + .append(new TaskRunnable(() -> gsp.refreshVersions())) .execute(); } @@ -158,6 +158,8 @@ public class InstallerPanel extends Page { for (InstallerVersionList.InstallerVersion v : versions) if (v != null) model.addRow(new Object[] { v.selfVersion == null ? "null" : v.selfVersion, v.mcVersion == null ? "null" : v.mcVersion }); + if (model.getRowCount() > 0) + model.removeRow(0); } }); } @@ -168,7 +170,7 @@ public class InstallerPanel extends Page { public void onSelect(TopTabPage page) { super.onSelect(page); if (!refreshed) { - TaskWindow.factory().execute(refreshVersionsTask()); + refreshVersions(); refreshed = true; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/AssetsMojangLoader.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/AssetsMojangLoader.java index 123010ceb..b8e78dcfb 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/AssetsMojangLoader.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/AssetsMojangLoader.java @@ -61,7 +61,7 @@ public class AssetsMojangLoader extends IAssetsHandler { } @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { if (!areDependTasksSucceeded) throw new IllegalStateException("Failed to get asset index"); String result = FileUtils.read(f); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/MinecraftAssetService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/MinecraftAssetService.java index e71afc3e8..a6f125638 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/MinecraftAssetService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/asset/MinecraftAssetService.java @@ -87,7 +87,7 @@ public class MinecraftAssetService extends IMinecraftAssetService { } @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) { if (areDependTasksSucceeded) { if (renamedFinal != null && !renamedFinal.delete()) HMCLog.warn("Failed to delete " + renamedFinal + ", maybe you should do it."); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java index 1f29886da..058b9d211 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java @@ -75,7 +75,7 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { } @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { File vpath = new File(service.baseDirectory(), "versions/" + id); if (!areDependTasksSucceeded) { FileUtils.deleteDirectory(vpath); @@ -131,7 +131,7 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { public Task downloadMinecraftVersionJson(String id) { return new TaskInfo("Download Minecraft Json") { @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { List versions = MinecraftRemoteVersions.getRemoteVersions(service.getDownloadType()).justDo(); MinecraftRemoteVersion currentVersion = null; for (MinecraftRemoteVersion v : versions) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/forge/MinecraftForgeVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/forge/MinecraftForgeVersionList.java index e9b581fc2..83abe9d4f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/forge/MinecraftForgeVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/forge/MinecraftForgeVersionList.java @@ -61,7 +61,7 @@ public class MinecraftForgeVersionList extends InstallerVersionList { } @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { if (!areDependTasksSucceeded) return; String s = task.getResult(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/liteloader/LiteLoaderVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/liteloader/LiteLoaderVersionList.java index c29ac776d..00656f7cd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/liteloader/LiteLoaderVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/liteloader/LiteLoaderVersionList.java @@ -61,7 +61,7 @@ public class LiteLoaderVersionList extends InstallerVersionList { } @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { if (!areDependTasksSucceeded) return; String s = task.getResult(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/bmcl/OptiFineBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/bmcl/OptiFineBMCLVersionList.java index 9a2b23c55..2bd65aafd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/bmcl/OptiFineBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/bmcl/OptiFineBMCLVersionList.java @@ -65,7 +65,7 @@ public class OptiFineBMCLVersionList extends InstallerVersionList { } @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { String s = task.getResult(); versionMap = new HashMap<>(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/vanilla/OptiFineVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/vanilla/OptiFineVersionList.java index 1cf495383..7761e8b10 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/vanilla/OptiFineVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/install/optifine/vanilla/OptiFineVersionList.java @@ -73,7 +73,7 @@ public class OptiFineVersionList extends InstallerVersionList { } @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { if (!areDependTasksSucceeded) return; String content = task.getResult(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/mod/ModpackManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/mod/ModpackManager.java index 8628f5940..e1eb95b0a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/mod/ModpackManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/mod/ModpackManager.java @@ -86,7 +86,7 @@ public final class ModpackManager { Collection c = new ArrayList<>(); @Override - public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { String id = idFUCK; String description = C.i18n("modpack.task.install.will"); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/Task.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/Task.java index 67650dc3e..6649cd0d5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/Task.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/Task.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.util.task; import java.util.Collection; +import org.jackhuang.hmcl.util.AbstractSwingWorker; /** * @@ -27,7 +28,7 @@ public abstract class Task { /** * Run in a new thread(packed in TaskList). - * + * * @param areDependTasksSucceeded Would be true if all of tasks which this task depends on have succeed. * @throws java.lang.Throwable If a task throws an exception, this task will be marked as `failed`. */ @@ -49,9 +50,9 @@ public abstract class Task { public boolean isAborted() { return aborted; } - + protected boolean hidden = false; - + public boolean isHidden() { return hidden; } @@ -63,9 +64,10 @@ public abstract class Task { /** * This method can be only invoked by TaskList. + * * @param s what the `executeTask` throws. */ - protected void setFailReason(Throwable s) { + protected void setFailReason(Exception s) { failReason = s; } @@ -73,12 +75,13 @@ public abstract class Task { /** * For FileDownloadTask: info replacement. - * @return + * + * @return */ public String getTag() { return tag; } - + public Task setTag(String tag) { this.tag = tag; return this; @@ -105,7 +108,7 @@ public abstract class Task { return new DoubleTask(this, t); } - public void runWithException() throws Throwable { + public void runWithException() throws Exception { Collection c = getDependTasks(); if (c != null) for (Task t : c) @@ -116,4 +119,13 @@ public abstract class Task { for (Task t : c) t.runWithException(); } + + public void runAsync() { + new AbstractSwingWorker() { + @Override + protected void work() throws Exception { + runWithException(); + } + }.execute(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/TaskList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/TaskList.java index 33e60bf70..ef9fe2c99 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/TaskList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/TaskList.java @@ -131,7 +131,7 @@ public class TaskList extends Thread { boolean flag = true; try { t.executeTask(areDependTasksSucceeded); - } catch (Throwable e) { + } catch (Exception e) { t.setFailReason(e); flag = false; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/TaskWorker.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/TaskWorker.java new file mode 100644 index 000000000..9ac7bf826 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/task/TaskWorker.java @@ -0,0 +1,68 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 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.task; + +import java.util.List; +import org.jackhuang.hmcl.api.func.Consumer; +import org.jackhuang.hmcl.util.AbstractSwingWorker; + +/** + * + * @author huang + */ +public abstract class TaskWorker extends Task { + + protected final AbstractSwingWorker worker; + + public TaskWorker() { + worker = new AbstractSwingWorker() { + @Override + protected void work() throws Exception { + runWithException(); + } + }; + } + + public TaskWorker reg(Consumer c) { + worker.reg(c); + return this; + } + + public TaskWorker regDone(Runnable c) { + worker.regDone(c); + return this; + } + + public void send(T... result) { + worker.send(result); + } + + @Override + public String getInfo() { + return "TaskWorker"; + } + + @Override + public void runAsync() { + worker.execute(); + } + + public List justDo() throws Exception { + return worker.justDo(); + } +}