From c43acb4e6200f1e4b11d7746e705740618bd4ed4 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Tue, 18 Aug 2026 21:26:15 +0800 Subject: [PATCH 1/3] Fixes #6703 --- HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java | 1 - .../java/org/jackhuang/hmcl/ui/construct/MDListCell.java | 3 ++- .../java/org/jackhuang/hmcl/ui/download/VersionsPage.java | 8 +++++--- .../org/jackhuang/hmcl/ui/instances/WorldListPage.java | 2 +- .../jackhuang/hmcl/ui/main/ThemePackManagementPage.java | 7 ++++--- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java b/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java index e534277b4a..91a7a44af4 100644 --- a/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java +++ b/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java @@ -417,7 +417,6 @@ private void releaseRippleImmediately() { if (overlayRect != null) { overlayRect.inAnimation.stop(); if (!forceOverlay) { - overlayRect.outAnimation.stop(); overlayRect.setOpacity(0D); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java index ba236c974e..91f10ea56c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java @@ -56,11 +56,12 @@ protected void updateItem(T item, boolean empty) { T oldItem = getItem(); boolean oldEmpty = isEmpty(); - ripplerContainer.releaseRippleImmediately(); super.updateItem(item, empty); if (oldItem == item && oldEmpty == empty) return; + ripplerContainer.releaseRippleImmediately(); + updateControl(item, empty); if (empty || item == null) { setGraphic(null); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java index 69a79bb7fc..918a66643c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java @@ -214,18 +214,20 @@ private void onOpenWiki() { @Override public void updateItem(RemoteVersion remoteVersion, boolean empty) { RemoteVersion oldRemoteVersion = getItem(); + boolean oldEmpty = isEmpty(); - ripplerContainer.releaseRippleImmediately(); super.updateItem(remoteVersion, empty); + if (oldRemoteVersion == remoteVersion && oldEmpty == empty) return; + + ripplerContainer.releaseRippleImmediately(); + if (empty) { setGraphic(null); return; } setGraphic(pane); - if (oldRemoteVersion == remoteVersion) return; - twoLineListItem.setTitle(I18n.getDisplayVersion(remoteVersion)); if (remoteVersion.getReleaseDate() != null) { twoLineListItem.setSubtitle(I18n.formatDateTime(remoteVersion.getReleaseDate())); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/WorldListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/WorldListPage.java index aa5134042e..377e62945a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/WorldListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/WorldListPage.java @@ -326,11 +326,11 @@ protected void updateItem(World world, boolean empty) { World oldWorld = getItem(); boolean oldEmpty = isEmpty(); - this.graphic.releaseRippleImmediately(); super.updateItem(world, empty); if (oldWorld == world && oldEmpty == empty) return; + this.graphic.releaseRippleImmediately(); this.content.getTags().clear(); if (empty || world == null) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java index 3be7b6c6dc..e96899ce24 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java @@ -714,20 +714,21 @@ private ThemePackItemCell(ThemePackManagementPage page) { @Override protected void updateItem(ThemePackManager.@Nullable InstalledThemePack themePack, boolean empty) { var currentItem = getItem(); + boolean oldEmpty = isEmpty(); - this.graphic.releaseRippleImmediately(); super.updateItem(themePack, empty); - if (Objects.equals(getItem(), currentItem)) return; + if (Objects.equals(getItem(), currentItem) && oldEmpty == empty) return; + this.graphic.releaseRippleImmediately(); content.getTags().clear(); iconImage.setImage(null); iconFallback.setVisible(false); + if (empty || themePack == null) { setGraphic(null); return; } - setGraphic(graphic); ThemePackManifest manifest = themePack.manifest(); From 385afa8aab21df13f352eac7f70e755303c6b4d6 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Tue, 18 Aug 2026 22:00:48 +0800 Subject: [PATCH 2/3] update --- .../org/jackhuang/hmcl/ui/construct/MDListCell.java | 4 +++- .../org/jackhuang/hmcl/ui/download/VersionsPage.java | 3 ++- .../jackhuang/hmcl/ui/instances/DownloadListPage.java | 9 ++++++++- .../org/jackhuang/hmcl/ui/instances/GameListCell.java | 10 +++++++++- .../jackhuang/hmcl/ui/instances/GameListPopupMenu.java | 8 +++++++- .../jackhuang/hmcl/ui/instances/SchematicsPage.java | 7 ++++++- .../org/jackhuang/hmcl/ui/main/JavaManagementPage.java | 7 ++++++- 7 files changed, 41 insertions(+), 7 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java index 91f10ea56c..0f50676e5d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java @@ -25,6 +25,8 @@ import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.ui.FXUtils; +import java.util.Objects; + public abstract class MDListCell extends ListCell { private static final PseudoClass SELECTED = PseudoClass.getPseudoClass("selected"); @@ -58,7 +60,7 @@ protected void updateItem(T item, boolean empty) { super.updateItem(item, empty); - if (oldItem == item && oldEmpty == empty) return; + if (Objects.equals(oldItem, item) && oldEmpty == empty) return; ripplerContainer.releaseRippleImmediately(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java index 918a66643c..2cd2c8c6fe 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java @@ -67,6 +67,7 @@ import org.jackhuang.hmcl.util.versioning.GameVersionNumber; import java.util.Locale; +import java.util.Objects; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -218,7 +219,7 @@ public void updateItem(RemoteVersion remoteVersion, boolean empty) { super.updateItem(remoteVersion, empty); - if (oldRemoteVersion == remoteVersion && oldEmpty == empty) return; + if (Objects.equals(oldRemoteVersion, remoteVersion) && oldEmpty == empty) return; ripplerContainer.releaseRippleImmediately(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java index f9ad6b1a11..499d6f9fd3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java @@ -581,8 +581,15 @@ protected ModDownloadListPageSkin(DownloadListPage control) { @Override protected void updateItem(RemoteAddon item, boolean empty) { - this.graphic.releaseRippleImmediately(); + RemoteAddon oldItem = getItem(); + boolean oldEmpty = isEmpty(); + super.updateItem(item, empty); + + if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + + this.graphic.releaseRippleImmediately(); + if (empty || item == null) { setGraphic(null); } else { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java index 54b881667a..4e36689028 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java @@ -35,6 +35,8 @@ import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.util.StringUtils; +import java.util.Objects; + import static org.jackhuang.hmcl.ui.FXUtils.determineOptimalPopupPosition; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -162,9 +164,15 @@ public void fire() { @Override public void updateItem(GameListItem item, boolean empty) { - this.graphic.releaseRippleImmediately(); + GameListItem oldItem = getItem(); + boolean oldEmpty = isEmpty(); + super.updateItem(item, empty); + if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + + this.graphic.releaseRippleImmediately(); + this.imageView.imageProperty().unbind(); this.content.titleProperty().unbind(); this.content.subtitleProperty().unbind(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java index e75758b142..cca97f068d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java @@ -44,6 +44,7 @@ import org.jackhuang.hmcl.util.StringUtils; import java.util.List; +import java.util.Objects; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -165,9 +166,14 @@ public Cell(ListView listView) { @Override protected void updateItem(GameItem item, boolean empty) { - this.ripplerContainer.releaseRippleImmediately(); + GameItem oldItem = getItem(); + boolean oldEmpty = isEmpty(); + super.updateItem(item, empty); + if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + + this.ripplerContainer.releaseRippleImmediately(); this.imageView.imageProperty().unbind(); this.content.titleProperty().unbind(); this.content.subtitleProperty().unbind(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java index 603f25ec5e..bbbc97115f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java @@ -613,9 +613,14 @@ public Cell() { @Override protected void updateItem(Item item, boolean empty) { - graphics.releaseRippleImmediately(); + Item oldItem = getItem(); + boolean oldEmpty = isEmpty(); + super.updateItem(item, empty); + if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + + graphics.releaseRippleImmediately(); iconImageView.setImage(null); if (empty || item == null) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java index c615ad8201..f1d359eb8a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java @@ -298,9 +298,14 @@ private static final class JavaItemCell extends ListCell { @Override protected void updateItem(JavaRuntime item, boolean empty) { JavaRuntime oldItem = getItem(); + boolean oldEmpty = isEmpty(); - this.graphic.releaseRippleImmediately(); super.updateItem(item, empty); + + if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + + this.graphic.releaseRippleImmediately(); + if (empty || item == null) { setGraphic(null); } else { From eff4084ff27ac4b25ce1781feb564faf79c0afb1 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Wed, 19 Aug 2026 22:42:18 +0800 Subject: [PATCH 3/3] update --- .../java/org/jackhuang/hmcl/ui/instances/GameListCell.java | 4 +--- .../org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java | 3 +-- .../java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java index 4e36689028..acff23e792 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java @@ -35,8 +35,6 @@ import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.util.StringUtils; -import java.util.Objects; - import static org.jackhuang.hmcl.ui.FXUtils.determineOptimalPopupPosition; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -169,7 +167,7 @@ public void updateItem(GameListItem item, boolean empty) { super.updateItem(item, empty); - if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + if (oldItem == item && oldEmpty == empty) return; this.graphic.releaseRippleImmediately(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java index cca97f068d..38f7bf361c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListPopupMenu.java @@ -44,7 +44,6 @@ import org.jackhuang.hmcl.util.StringUtils; import java.util.List; -import java.util.Objects; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -171,7 +170,7 @@ protected void updateItem(GameItem item, boolean empty) { super.updateItem(item, empty); - if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + if (oldItem == item && oldEmpty == empty) return; this.ripplerContainer.releaseRippleImmediately(); this.imageView.imageProperty().unbind(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java index f1d359eb8a..e21c322de8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java @@ -302,7 +302,7 @@ protected void updateItem(JavaRuntime item, boolean empty) { super.updateItem(item, empty); - if (Objects.equals(oldItem, item) && oldEmpty == empty) return; + if (oldItem == item && oldEmpty == empty) return; this.graphic.releaseRippleImmediately();