Signaler

Fade out puis fade in javaFX [Résolu]

Posez votre question andredrea 205Messages postés lundi 12 octobre 2009Date d'inscription 1 août 2017 Dernière intervention - Dernière réponse le 1 août 2017 à 13:49 par andredrea
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();
	}

  }

}
Afficher la suite 
Utile
+0
plus moins
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);
    }
}
andredrea 205Messages postés lundi 12 octobre 2009Date d'inscription 1 août 2017 Dernière intervention - 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
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !