Fade out puis fade in javaFX

Résolu/Fermé
andredrea Messages postés 227 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 3 mars 2021 - 31 juil. 2017 à 13:08
andredrea Messages postés 227 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 3 mars 2021 - 1 août 2017 à 13:49
Bonjour,
je suis en train de faire une application en javafx, celle ci est composée d'une page de bienvenue avant l'arrivée sur le menu. Les effets sont un fade in du welcome, un fade out puis un fade in du
menu.
Les effets fonctionnent. Cependant, avant l'apparition progressive du menu, j'ai une sorte de flash du menu. Je ne vois pas quel est le probleme.

Si vous pouviez m'aider,
merci !

package application;


import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle;

import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.util.Duration;

public class MyController implements Initializable {

  @FXML
  private Text now;
  @FXML
  private Text update;

  @FXML
  private AnchorPane rootAP;

  @Override
  public void initialize(URL location, ResourceBundle resources) {

	  if(!Main.isSplashLoaded){
		  loadSplashScreen();
	  }

	File file = new File("resources/bg2.jpg");
	File date2 = new File("resources/bg8.jpg");
	if(!file.exists() || !date2.exists()){
		System.out.println("Erreur de fichier");
		System.exit(0);
	} else {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

		String last;
		if(date2.compareTo(file) > 0){
			last = sdf.format(date2.lastModified());
		}else {
			last = sdf.format(file.lastModified());
		}
		update.setText("Dernière mise à jour: "+last);

		Timeline clock = new Timeline(new KeyFrame(Duration.ZERO, e -> {
				DateFormat mediumDateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.SHORT);
				Date date = new Date();
				now.setText(mediumDateFormat.format(date));
	    	}),
	        new KeyFrame(Duration.seconds(1))
	    );
	    clock.setCycleCount(Animation.INDEFINITE);
	    clock.play();
	}

  }

  private void loadSplashScreen(){
	  try {

		Main.isSplashLoaded = true;
		StackPane pane = FXMLLoader.load(getClass().getResource(("Splash.fxml")));
		rootAP.getChildren().setAll(pane);

		FadeTransition fadeIn = new FadeTransition(Duration.seconds(3),pane);
		fadeIn.setFromValue(0);
		fadeIn.setToValue(1);
		fadeIn.setCycleCount(1);

		FadeTransition fadeOut = new FadeTransition(Duration.seconds(3),pane);
		fadeOut.setFromValue(1);
		fadeOut.setToValue(0);
		fadeOut.setCycleCount(1);

		fadeIn.play();
		fadeIn.setOnFinished((e)->{fadeOut.play();});

		fadeOut.setOnFinished((e)->{
			try {
				AnchorPane parentContent = FXMLLoader.load(getClass().getResource(("Menu.fxml")));
				rootAP.getChildren().setAll(parentContent );

				FadeTransition fadeIn2 = new FadeTransition(Duration.seconds(3),parentContent);
				fadeIn2.setFromValue(0);
				fadeIn2.setToValue(1);
				fadeIn2.setCycleCount(1);
				fadeIn2.play();

			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		});
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

  }

}

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
31 juil. 2017 à 18:15
Bonjour,

Je n'ai pas testé, notamment parce que je n'ai pas tes fichiers .fxml donc ça ne va pas afficher grand chose, mais en général cela se produit parce que tu affiches ta fenêtre trop tôt, avant qu'elle ne sache qu'elle doit faire une animation au démarrage.

Je pense par exemple que
fadeIn.play();
devrait être appelé après le
fadeIn.setOnFinished
pour qu'il sache déjà comment se termine l'animation au moment où il la commence.

Remarque : quand tu as des expressions lambda simples comme
fadeIn.setOnFinished((e)->{fadeOut.play();});
tu peux simplifier et mettre
fadeIn.setOnFinished(e -> fadeOut.play());
, en revanche quand tu as des expressions beaucoup plus longues comme ton
fadeOut.setOnFinished
il faudrait penser à le mettre dans une méthode à part.

Exemple :
fadeOut.setOnFinished(this::fadeOutOnFinished)
avec :

 // import javafx.event.ActionEvent
private void fadeOutOnFinished(ActionEvent evt) {
    try {
        AnchorPane parentContent = FXMLLoader.load(getClass().getResource(("Menu.fxml")));
        rootAP.getChildren().setAll(parentContent);
        FadeTransition fadeIn = new FadeTransition(Duration.seconds(3), parentContent);
        fadeIn.setFromValue(0);
        fadeIn.setToValue(1);
        fadeIn.setCycleCount(1);
        fadeIn.play();
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}
0
andredrea Messages postés 227 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 3 mars 2021 3
1 août 2017 à 13:49
J'ai complètement changé mon code entre temps pour que ça marche !
Merci pour vos remarques j'en prend note ! Bonne aprem
0