Alexander Falk
Alexander Falk

Reputation: 521

JavaFX - FadeOut --> Switch Stage

I have been searching around the internet and I can't find a answer to my question, so I will try to make it myself and hope for the best!

I have a primarystage which provides a Welcome and then fades out, but I want to switch stage in that moment that the fade is gone! Do anyone have a answer to this?

The small code below to get a better understanding:

import java.util.Timer;
import java.util.TimerTask;
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.geometry.Insets;

import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Duration;



public class TextFileOPG extends Application {

private Stage switchStage;

@Override
public void start(Stage primaryStage) {
    try {

            switchStage = primaryStage;

            GridPane root = new GridPane();

            root.setAlignment(Pos.CENTER);

            Text scenetitle = new Text("Welcome");
            scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40));
            root.add(scenetitle, 3, 2);

            FadeTransition ftOUT = new FadeTransition(Duration.millis(3000), root);
            ftOUT.setFromValue(1.0);
            ftOUT.setToValue(0.0);
            ftOUT.play();

            if(ftOUT.equals(Duration.millis(3000)))
            {
                loggedIn();
            }

            primaryStage.setTitle("Welcome");
            Scene scene = new Scene(root,350,400);
            primaryStage.setScene(scene);
            primaryStage.show();


    } catch(Exception e) {
        e.printStackTrace();
    }
}

public void loggedIn() 
{
    switchStage.setTitle("Try");

    GridPane grid = new GridPane();

    grid.setAlignment(Pos.CENTER);

    Text thisIsSoCoolText = new Text("Welcome Again");
    thisIsSoCoolText.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40));
    grid.add(thisIsSoCoolText, 3, 2);

    Scene scene = new Scene(grid, 350, 400);
    switchStage.setScene(scene);
    switchStage.show();
}

public static void main(String[] args) {
    launch(args);
}
}

Upvotes: 2

Views: 833

Answers (2)

sazzy4o
sazzy4o

Reputation: 3343

Try using a timeline instead of a fade transition. Timeline can be used for all sorts of animations and UI updates.

Here is the code that worked for me:

import java.util.Timer;
import java.util.TimerTask;

import javafx.animation.FadeTransition;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Duration;



public class TextFileOPG extends Application {

private Stage switchStage;
final double opacity=1;
@Override
public void start(Stage primaryStage) {
try {

        switchStage = primaryStage;

        GridPane root = new GridPane();

        root.setAlignment(Pos.CENTER);

        Text scenetitle = new Text("Welcome");
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40));
        root.add(scenetitle, 3, 2);          


        primaryStage.setTitle("Welcome");
        Scene scene = new Scene(root,350,400);
        primaryStage.setScene(scene);
        primaryStage.show();
        Timeline tick0 = new Timeline();
        tick0.setCycleCount(Timeline.INDEFINITE);
        tick0.getKeyFrames().add(
                new KeyFrame(new Duration(30), new EventHandler<ActionEvent>() {
                    public void handle(ActionEvent t) {
                        root.setOpacity(root.getOpacity()-0.01);
                        if(root.getOpacity()<0.01){//30 divided by 0.01 equals 3000 so you take the duration and divide it be the opacity to get your transition time in milliseconds
                            loggedIn();
                            tick0.stop();
                        }
                    }}));
        tick0.play();

} catch(Exception e) {
    e.printStackTrace();
}
}

public void loggedIn() 
{
switchStage.setTitle("Try");

GridPane grid = new GridPane();

grid.setAlignment(Pos.CENTER);

Text thisIsSoCoolText = new Text("Welcome Again");
thisIsSoCoolText.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40));
grid.add(thisIsSoCoolText, 3, 2);

Scene scene = new Scene(grid, 350, 400);
switchStage.setScene(scene);
switchStage.show();
}

  public static void main(String[] args) {
launch(args);
}
}

Upvotes: 1

James_D
James_D

Reputation: 209339

Instead of

if(ftOUT.equals(Duration.millis(3000))) {
    loggedIn();
}

(which will never work: a FadeTransition instance cannot possibly be equal to a Duration instance), use an onFinished handler for the fade transition:

ftOUT.setOnFinished(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        loggedIn();
    }
});

Note that you should call this before ftOUT.play() (though it will work anyway...).

If you use JavaFX 8, you can just do

ftOUT.setOnFinished(event -> loggedIn());

Upvotes: 1

Related Questions