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

在JavaFX中更改场景而不调整窗口大小,java,javafx,scene,Java,Javafx,Scene,我试图在JavaFX上更改场景,但不更改窗口大小。但是,当我设置stage.setScene(场景2)时窗口大小减小,我希望两个场景都最大化。我尝试在stage.setScene(scene2)之后stage.setMaximized(true)但结果是相同的 我怎样才能修好它 我的代码: package controller; import java.io.IOException; import javafx.animation.FadeTransition; import javafx.

我试图在JavaFX上更改场景,但不更改窗口大小。但是,当我设置
stage.setScene(场景2)时窗口大小减小,我希望两个场景都最大化。我尝试在
stage.setScene(scene2)之后
stage.setMaximized(true)
但结果是相同的

我怎样才能修好它

我的代码:

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);
    }
}
当我编译时:

然后淡出/淡出发生(我希望在这里保持最大化):

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

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();
    }
});

在过去的4-5个小时里,我一直在处理一个类似于你的问题,并且给出了@James_D的答案,我看到了简单地通过场景更改来解决大小调整问题的方法。这个答案仍然直接来自于@James_D,但我觉得没有一个关于发生了什么的明确解释,所以我发布这个帖子的目的是帮助任何人理解@James_D提供的第二个解决方案(即改变场景,而不是场景的根源)为什么有效

注意:我确实遇到了一些答案,指出为场景设置一个新的根可能比更改整个场景更好,但这在我的情况下不起作用,因此更改场景是我的最佳选择

不管怎么说,我很确定在交换场景时场景改变大小的原因是因为没有明确设置场景对象上的场景宽度和高度属性。在将新场景加载到舞台时,似乎没有专门设置大小,以使场景自动调整到其包含的对象的边界

基本上,要解决此问题,只需在创建场景时设置宽度和高度属性,如下所示

以前

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