Изменение сцены без изменения размера окна в JavaFX

#java #javafx #scene

#java #javafx #сцена

Вопрос:

Я пытаюсь изменить сцены в 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);
    }
}
  

Когда я компилирую:
введите описание изображения здесь

Затем происходит затухание / затухание и (именно здесь я хочу сохранить максимальное значение): введите описание изображения здесь

Комментарии:

1. Вам действительно нужно переключать сцены? Почему бы просто не заменить корень существующей сцены?

2. Я уже думал об этом, но мне интересно, как это сделать, просто как способ изучения.

Ответ №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 (т.Е. Изменение сцен, а не кореньсцена) работает.

Примечание: я наткнулся на несколько ответов, в которых говорилось, что установка нового корня для сцены может быть лучшим вариантом, чем изменение всей сцены, но в моем случае это не сработало, поэтому изменение сцен было лучшим вариантом для меня.

В любом случае, я почти уверен, что причина, по которой сцена меняет размеры при замене, заключается в том, что вы явно не задаете атрибуты ширины и высоты сцены для объекта сцены. По-видимому, отсутствие специальной настройки размера заставляет сцену автоматически приспосабливаться к границам объектов, которые она содержит, при загрузке новой сцены на сцену.

В принципе, чтобы устранить проблему, все, что вам нужно сделать, это установить атрибуты 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