package com.temporaryteam.noticeditor.view;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.animation.TranslateTransition;
import javafx.event.ActionEvent;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.util.Duration;

/**
 * Simple notification.
 * @author aNNiMON
 */
public final class Notification {
	
	public static final Duration DURATION_SHORT = new Duration(2000);
	public static final Duration DURATION_LONG = new Duration(5000);
	private static final Duration TRANSITION_DURATION = new Duration(300);

	private static VBox notificationBox;
	private static Label notificationLabel;
	
	private static Timeline hideTimer;
	private static TranslateTransition transitionIn, transitionOut;
	
	public static void init(VBox vbox, Label label) {
		notificationBox = vbox;
		notificationLabel = label;
		
		transitionIn = new TranslateTransition(TRANSITION_DURATION, notificationBox);
		transitionIn.setToY(0);
		
		transitionOut = new TranslateTransition(TRANSITION_DURATION, notificationBox);
		transitionOut.setFromY(0);
		transitionOut.setOnFinished((e) -> notificationBox.setVisible(false));
	}
	
	public static void show(String text) {
		show(text, DURATION_SHORT);
	}
	
	public static void show(String text, Duration duration) {
		if (hideTimer != null) {
			// show new notification while previous exists
			hideTimer.stop();
			transitionOut.stop();
		}
		notificationLabel.setText(text);
		hideTimer = new Timeline(new KeyFrame(duration.add(TRANSITION_DURATION)));
		hideTimer.setOnFinished(Notification::hide);
		hideTimer.playFromStart();
		notificationBox.setVisible(true);
		
		transitionIn.setFromY(notificationBox.getHeight());
		transitionIn.playFromStart();
	}
	
	private static void hide(ActionEvent e) {
		if (hideTimer != null) {
            hideTimer.stop();
            hideTimer = null;
        }
		transitionOut.setToY(notificationBox.getHeight());
		transitionOut.playFromStart();
	}
}

package com.temporaryteam.noticeditor.view;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.animation.TranslateTransition;
import javafx.event.ActionEvent;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.util.Duration;

/**
 * Simple notification.
 * @author aNNiMON
 */
public final class Notification {
	
	public static final Duration DURATION_SHORT = new Duration(2000);
	public static final Duration DURATION_LONG = new Duration(5000);
	
	private static final Duration TRANSITION_DURATION = new Duration(300);
	private static final Paint PAINT_MESSAGE = Color.WHITE;
	private static final Paint PAINT_ERROR = Color.rgb(255, 80, 80);
	private static final Paint PAINT_SUCCESS = Color.LIGHTGREEN;

	private static VBox notificationBox;
	private static Label notificationLabel;
	
	private static Timeline hideTimer;
	private static TranslateTransition transitionIn, transitionOut;
	
	public static void init(VBox vbox, Label label) {
		notificationBox = vbox;
		notificationLabel = label;
		
		transitionIn = new TranslateTransition(TRANSITION_DURATION, notificationBox);
		transitionIn.setToY(0);
		
		transitionOut = new TranslateTransition(TRANSITION_DURATION, notificationBox);
		transitionOut.setFromY(0);
		transitionOut.setOnFinished((e) -> notificationBox.setVisible(false));
	}
	
	public static void show(String text) {
		show(text, DURATION_SHORT);
	}
	
	public static void show(String text, Duration duration) {
		show(text, duration, PAINT_MESSAGE);
	}
	
	public static void error(String text) {
		show(text, DURATION_LONG, PAINT_ERROR);
	}
	
	public static void success(String text) {
		show(text, DURATION_LONG, PAINT_SUCCESS);
	}
	
	public static void show(String text, Duration duration, Paint textFill) {
		if (hideTimer != null) {
			// show new notification while previous exists
			hideTimer.stop();
			transitionOut.stop();
		}
		notificationLabel.setTextFill(textFill);
		notificationLabel.setText(text);
		hideTimer = new Timeline(new KeyFrame(duration.add(TRANSITION_DURATION)));
		hideTimer.setOnFinished(Notification::hide);
		hideTimer.playFromStart();
		notificationBox.setVisible(true);
		
		transitionIn.setFromY(notificationBox.getHeight());
		transitionIn.playFromStart();
	}
	
	private static void hide(ActionEvent e) {
		if (hideTimer != null) {
            hideTimer.stop();
            hideTimer = null;
        }
		transitionOut.setToY(notificationBox.getHeight());
		transitionOut.playFromStart();
	}
}

Add notification types