#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