All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sshtools.jajafx.AnimPane Maven / Gradle / Ivy

The newest version!
package com.sshtools.jajafx;

import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.scene.Node;
import javafx.scene.layout.StackPane;
import javafx.util.Duration;

public class AnimPane extends StackPane {

	private Duration duration = Duration.millis(125);
	private Interpolator interpolator = Interpolator.EASE_BOTH;
	private Animation waiting;

	public Interpolator getInterpolator() {
		return interpolator;
	}

	public void setInterpolator(Interpolator interpolator) {
		this.interpolator = interpolator;
	}

	public Duration getDuration() {
		return duration;
	}

	public void setDuration(Duration duration) {
		this.duration = duration;
	}

	public void setContent(PageTransition dir, Node node) {
		doAnim(dir, node);
	}

	protected final Node doAnim(PageTransition dir, Node node) {
		if(waiting != null) {
			waiting.stop();
			waiting.getOnFinished().handle(null);
			waiting = null;
		}
		try {
			switch (dir) {
			case FROM_LEFT:
				return slideInFromLeft(node);
			case FROM_RIGHT:
				return slideInFromRight(node);
			case FROM_TOP:
				return slideInFromTop(node);
			case FROM_BOTTOM:
				return slideInFromBottom(node);
			case FADE:
				return fadeIn(node);
			default:
				return none(node);
			}
		}
		finally {
			onChange(node);
		}
	}

	protected void onChange(Node node) {
	}

	Node none(Node paneToAdd) {
		var paneToRemove = getChildren().isEmpty() ? null : getChildren().get(0);
		if (paneToRemove != null) {
			getChildren().remove(paneToRemove);
		}
		getChildren().add(paneToAdd);
		return paneToRemove;
	}

	Node fadeIn(Node paneToAdd) {
		var paneToRemove = getChildren().isEmpty() ? null : getChildren().get(0);

		getChildren().add(paneToAdd);
		var fadeInTransition = new FadeTransition(duration);
		
		if (paneToRemove != null) {
			var fadeOutTransition = new FadeTransition(duration);
			fadeOutTransition.setOnFinished(evt -> {
				waiting = null;
				getChildren().remove(paneToRemove);
			});
			fadeOutTransition.setNode(paneToRemove);
			fadeOutTransition.setFromValue(1);
			fadeOutTransition.setToValue(0);
			fadeOutTransition.play();
			waiting = fadeOutTransition;
		}
		fadeInTransition.setNode(paneToAdd);
		fadeInTransition.setFromValue(0);
		fadeInTransition.setToValue(1);
		fadeInTransition.play();

		return paneToRemove;
	}

	Node fadeOut(Node paneToAdd) {
		var paneToRemove = getChildren().get(0);
		getChildren().add(0, paneToAdd);

		var fadeOutTransition = new FadeTransition(duration);

		fadeOutTransition.setOnFinished(evt -> {
			waiting = null;
			getChildren().remove(paneToRemove);
		});
		waiting = fadeOutTransition;

		fadeOutTransition.setNode(paneToRemove);
		fadeOutTransition.setFromValue(1);
		fadeOutTransition.setToValue(0);
		fadeOutTransition.play();

		return paneToRemove;
	}

	Node slideInFromLeft(Node paneToAdd) {
		var paneToRemove = getChildren().get(0);

		paneToAdd.translateXProperty().set(-1 * getWidth());
		getChildren().add(paneToAdd);

		var keyValue = new KeyValue(paneToAdd.translateXProperty(), 0, interpolator);
		var outKeyValue = new KeyValue(paneToRemove.translateXProperty(), getWidth(), interpolator);
		var keyFrame = new KeyFrame(duration, keyValue, outKeyValue);
		var timeline = new Timeline(keyFrame);
		timeline.setOnFinished(evt -> {
			waiting = null;
			getChildren().remove(paneToRemove);
		});
		
		timeline.play();
		waiting = timeline;

		return paneToRemove;
	}

	Node slideInFromRight(Node paneToAdd) {
		var paneToRemove = getChildren().get(0);

		paneToAdd.translateXProperty().set(getWidth());
		getChildren().add(paneToAdd);

		var keyValue = new KeyValue(paneToAdd.translateXProperty(), 0, interpolator);
		var outKeyValue = new KeyValue(paneToRemove.translateXProperty(), -1 * getWidth(), interpolator);
		var keyFrame = new KeyFrame(duration, keyValue, outKeyValue);
		var timeline = new Timeline(keyFrame);
		timeline.setOnFinished(evt -> {
			waiting = null;
			getChildren().remove(paneToRemove);
		});
		timeline.play();
		waiting = timeline;
		return paneToRemove;
	}

	Node slideInFromBottom(Node paneToAdd) {
		var paneToRemove = getChildren().get(0);

		paneToAdd.translateYProperty().set(getHeight());
		getChildren().add(paneToAdd);

		var keyValue = new KeyValue(paneToAdd.translateYProperty(), 0, interpolator);
		var outKeyValue = new KeyValue(paneToRemove.translateYProperty(), -getHeight(), interpolator);
		var keyFrame = new KeyFrame(duration, keyValue, outKeyValue);
		var timeline = new Timeline(keyFrame);
		timeline.setOnFinished(evt -> {
			waiting = null;
			getChildren().remove(paneToRemove);
		});
		timeline.play();
		waiting = timeline;
		return paneToRemove;
	}

	Node slideInFromTop(Node paneToAdd) {
		var paneToRemove = getChildren().get(0);

		paneToAdd.translateYProperty().set(-1 * getHeight());

		getChildren().add(paneToAdd);

		var keyValue = new KeyValue(paneToAdd.translateYProperty(), 0, interpolator);
		var outKeyValue = new KeyValue(paneToRemove.translateYProperty(), getHeight(), interpolator);
		var keyFrame = new KeyFrame(duration, keyValue, outKeyValue);
		var timeline = new Timeline(keyFrame);
		timeline.setOnFinished(evt -> {
			waiting = null;
			getChildren().remove(paneToRemove);
		});
		timeline.play();
		waiting = timeline;
		return paneToRemove;
	}

	public Node getContent() {
		return getChildren().isEmpty() ? null : getChildren().get(getChildren().size() - 1);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy