Search code examples
javajavafxtimeline

changing scene in javafx


what's the matter with this code? i'm relly confused!! i wanted to change my scene in main stage.

public class SignInController {
    @FXML
    TextField SignInPassword;

    @FXML
    TextField SignInUsername;

    @FXML
    CheckBox RememberMe;

    public void signUpScene(MouseEvent mouseEvent) throws IOException {
        Timeline timeline = new Timeline();
        Scene SignUpScene = new Scene(FXMLLoader.load(getClass().getResource("sign up.fxml")),700,700);
        Main.pstage.setScene(SignUpScene);
        timeline.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO,new KeyValue(SignUpScene.getWidth(),0.0 )),
                new KeyFrame(Duration.millis(1000.0d),new KeyValue(SignUpScene.getWidth(),700.0 ) )
        );

        timeline.play();
    }
}

Solution

  • If you want to animate the width of the stage holding your new scene, you can use a Transition:

    public void signUpScene(MouseEvent mouseEvent) throws IOException {
            Scene SignUpScene = new Scene(FXMLLoader.load(getClass().getResource("sign up.fxml")),700,700);
            Main.pstage.setScene(SignUpScene);
    
            Rectangle clip = new Rectangle(0, 700);
    
            Transition animateStage = new Transition() {
                {
                    setCycleDuration(Duration.millis(1000));
                }
                @Override
                protected void interpolate(double t) {
                    Main.pstage.setWidth(t * 700.0);
                }
            };
            animateStage.play();
        }
    }
    

    Maybe a better approach would be to gradually reveal the new scene using a clip:

    public void signUpScene(MouseEvent mouseEvent) throws IOException {
    
            Parent root = FXMLLoader.load(getClass().getResource("sign up.fxml"));
    
            Scene SignUpScene = new Scene(root,700,700);
            Main.pstage.setScene(SignUpScene);
    
            Rectangle clip = new Rectangle(0, 700);
            Timeline animate = new Timeline(
               new KeyFrame(Duration.millis(1000), 
                   new KeyValue(clip.widthProperty(), 700.0));
            root.setClip(clip);
            // when animation finishes, remove clip:
            animate.setOnFinished(e -> root.setClip(null));
            animate.play();
        }
    }