diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionPane.java index 2cda33e6a..2a5fe168e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionPane.java @@ -31,6 +31,7 @@ import org.jetbrains.annotations.Nullable; public class TransitionPane extends StackPane { private Node currentNode; + private Animation oldAnimation; public TransitionPane() { FXUtils.setOverflowHidden(this); @@ -50,6 +51,11 @@ public class TransitionPane extends StackPane { public void setContent(Node newView, AnimationProducer transition, Duration duration, Interpolator interpolator) { + if (oldAnimation != null) { + oldAnimation.stop(); + oldAnimation = null; + } + Node previousNode = currentNode != newView && getWidth() > 0 && getHeight() > 0 ? currentNode : null; currentNode = newView; @@ -80,15 +86,19 @@ public class TransitionPane extends StackPane { previousNode, newView, duration, interpolator); - newAnimation.setOnFinished(e -> { - setMouseTransparent(false); - getChildren().remove(previousNode); + newAnimation.statusProperty().addListener((observable, oldValue, newValue) -> { + if (oldValue == Animation.Status.RUNNING && newValue != Animation.Status.RUNNING) { + setMouseTransparent(false); + getChildren().remove(previousNode); - if (cacheHint != null) { - newView.setCache(false); + if (cacheHint != null) { + newView.setCache(false); + } } }); - FXUtils.playAnimation(this, "transition_pane", newAnimation); + + oldAnimation = newAnimation; + newAnimation.play(); }); }