From bdf6a58be8c05ea91d0d5ec8c8a79f2cd71bc787 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sat, 16 May 2026 03:00:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=20Swing=20=E7=AA=97=E5=8F=A3=E6=97=B6=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=20JavaFX=20=E4=B8=8B=E8=BD=BD=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=A1=86=20(#6074)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/util/SelfDependencyPatcher.java | 71 +++++++++++++++++-- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java index 6844732b29..d6807c914c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java @@ -269,7 +269,14 @@ public final class SelfDependencyPatcher { AtomicBoolean isCancelled = new AtomicBoolean(); AtomicBoolean showDetails = new AtomicBoolean(); - ProgressFrame dialog = new ProgressFrame(i18n("download.javafx")); + ProgressFrame dialog; + try { + dialog = new SwingProgressFrame(i18n("download.javafx")); + } catch (HeadlessException e) { + LOG.warning("Failed to open dialog", e); + dialog = new FakeProgressFrame(); + } + dialog.setProgressMaximum(dependencies.size() + 1); dialog.setProgress(count); dialog.setOnCancel(() -> isCancelled.set(true)); @@ -296,9 +303,10 @@ public final class SelfDependencyPatcher { DependencyDescriptor dependency = dependencies.get(i); final String url = repository.resolveDependencyURL(dependency); + ProgressFrame finalDialog = dialog; SwingUtilities.invokeLater(() -> { - dialog.setCurrent(dependency.module); - dialog.incrementProgress(); + finalDialog.setCurrent(dependency.module); + finalDialog.incrementProgress(); }); LOG.info("Downloading " + url); @@ -382,14 +390,32 @@ public final class SelfDependencyPatcher { } } - public static class ProgressFrame extends JDialog { + public sealed interface ProgressFrame { + void setCurrent(String component); + + void setProgressMaximum(int total); + + void setProgress(int n); + + void incrementProgress(); + + void setOnCancel(Runnable action); + + void setOnChangeSource(Runnable action); + + void setVisible(boolean visible); + + void dispose(); + } + + public static final class SwingProgressFrame extends JDialog implements ProgressFrame { private final JProgressBar progressBar; private final JLabel progressText; private final JButton btnChangeSource; private final JButton btnCancel; - public ProgressFrame(String title) { + public SwingProgressFrame(String title) { JPanel panel = new JPanel(); setResizable(false); @@ -453,4 +479,39 @@ public final class SelfDependencyPatcher { btnChangeSource.addActionListener(e -> action.run()); } } + + public static final class FakeProgressFrame implements ProgressFrame { + + @Override + public void setCurrent(String component) { + } + + @Override + public void setProgressMaximum(int total) { + } + + @Override + public void setProgress(int n) { + } + + @Override + public void incrementProgress() { + } + + @Override + public void setOnCancel(Runnable action) { + } + + @Override + public void setOnChangeSource(Runnable action) { + } + + @Override + public void setVisible(boolean visible) { + } + + @Override + public void dispose() { + } + } }