在JavaFX中更改场景而不调整窗口大小
我正在尝试更改JavaFX上的场景,但不更改窗口大小。 但是,当我设置stage.setScene(scene2);
窗口大小减小,我想保持两个场景最大化。 我试过stage.setScene(scene2);
之后的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); } }
当我编译:
然后fadeOut / fadeIn发生并且(在这里我想保持最大化):
在这里替换现有场景的根源可能比创建新场景更好:
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的答案,我看到了简单修复场景变化的resize问题的方法。 这个答案仍然直接取决于@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