在JavaFX中更改场景而不调整窗口大小

时间:2016-10-11 19:42:04

标签: java javafx scene

我正在尝试更改JavaFX上的场景,但不更改窗口大小。但是,当我设置stage.setScene(scene2);窗口大小减小时,我想保持两个场景最大化。我在stage.setMaximized(true)之后尝试stage.setScene(scene2);,但结果是一样的。

我该如何解决?

我的代码:

package controller;

import java.io.IOException;

import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.util.Duration;

public class App extends Application {  
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("../view/fxml/Loading.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.setTitle("Project");
        stage.setMaximized(true);
        stage.show();

        FadeTransition fadeIn = new FadeTransition(Duration.seconds(1), root);
        fadeIn.setFromValue(0);
        fadeIn.setToValue(1);

        FadeTransition fadeOut = new FadeTransition(Duration.seconds(1), root);
        fadeOut.setFromValue(1);
        fadeOut.setToValue(0);

        fadeIn.play();

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

        fadeOut.setOnFinished((e) -> {
            try {               
                Parent root2 = FXMLLoader.load(getClass().getResource("../view/fxml/Welcome.fxml"));

                Scene scene2 = new Scene(root2);

                stage.setScene(scene2);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        });
    }

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

编译时: enter image description here

然后fadeOut / fadeIn发生并且(在这里我想保持最大化): enter image description here

2 个答案:

答案 0 :(得分:5)

在这里替换现有场景的根源可能比创建新场景更好:

fadeOut.setOnFinished((e) -> {
    try {               
        Parent root2 = FXMLLoader.load(getClass().getResource("../view/fxml/Welcome.fxml"));

        scene.setRoot(root2);

    } catch (IOException e1) {
        e1.printStackTrace();
    }
});

如果您确实需要更换场景,出于某种原因,您可以将新场景的大小设置为与现有场景相同:

fadeOut.setOnFinished((e) -> {
    try {               
        Parent root2 = FXMLLoader.load(getClass().getResource("../view/fxml/Welcome.fxml"));

        Scene scene2 = new Scene(root2, scene.getWidth(), scene.getHeight());

        stage.setScene(scene2);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
});

答案 1 :(得分:2)

在过去的4-5个小时里,我一直在处理类似于你的问题,并且在@ James_D的回答中,我看到了简单修复场景变化的调整大小问题的方法。这个答案仍然直接取决于@James_D,但我觉得没有明确解释发生了什么,所以我发布的内容比帮助任何遇到这个线程的人更了解为什么第二个解决方案@James_D提供(即更改场景,而不是场景的根)工作。

注意:我确实遇到了几个答案,说明为场景设置新的根可能比改变整个场景更好,但这在我的情况下不起作用,所以改变场景对我来说是最好的选择。

无论如何,我很确定交换时场景改变大小的原因是因为你没有明确地设置场景对象的场景宽度和高度属性。当新场景加载到舞台时,没有专门设置大小似乎使场景自动调整到它包含的对象的边界。

基本上,要解决问题,您需要做的就是在创建场景时设置width和height属性,如下所示。

Scene scene2 = new Scene(root2);

Scene scene2 = new Scene(root2, 900, 600);//or whatever size you want
stage.setScene(scene2);//now we are set if initial scene is 900w X 600h, scene size will stay the same