【问题标题】:Change Scene without resize window in JavaFX在 JavaFX 中更改场景而不调整窗口大小
【发布时间】:2016-10-11 19:42:04
【问题描述】:

我正在尝试更改 JavaFX 上的场景,但不更改窗口大小。但是,当我设置stage.setScene(scene2); 时,窗口大小会减小,并且我想保持两个场景最大化。我在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);
    }
}

当我编译时:

然后发生淡出/淡入(我想保持最大化):

【问题讨论】:

  • 真的需要切换场景吗?为什么不直接替换现有场景的根?
  • 我已经想到了,但我想知道如何做到这一点,就像学习的一种方式。

标签: java javafx scene


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在过去的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多