我正在处理我的项目,该项目有两个 fxml 文件,我设法以两种方式从MainController打开两个fxml文件,如
通过单击按钮
执行的操作
问题在于第二种方式:fxml文件根据我已在主要FXML文件中使用坐标定义的子Anchor Pane不合适,它出现在primaryStage的左上角,并且是有什么方法可以解决这个问题吗?
MainController.java
@FXML
private Button okay;
@FXML
private AnchorPane HostScreen,MainScreen;
class NewStage{
NewStage() throws IOException{
Stage subStage = new Stage();
subStage.setTitle("Connect To MySQL Host");
HostScreen = (AnchorPane)FXMLLoader.load(getClass().getResource("SQLHostWindow.fxml"));
Scene HostScene = new Scene(HostScreen,640,400);
subStage.setScene(HostScene);
subStage.centerOnScreen();
subStage.show();
}
}
class NewScene{
NewScene() throws IOException{
HostScreen = (AnchorPane)FXMLLoader.load(getClass().getResource("SQLHostWindow.fxml"));
MainScreen.getChildren().set(0, HostScreen);
System.out.println(MainScreen.getChildren().get(0));
}
}
@FXML
public void OpenHostScreen(ActionEvent event) throws IOException{
new NewStage();
new NewScene();
}
答案 0 :(得分:3)
首先,使用内部类的构造函数来修改场景是绝对无意义的,除非这些类具有一些其他功能。在这种情况下,您只是创建对象没有真正的原因。相反,应将功能移至方法,例如
void replaceChild() throws IOException{
HostScreen = (AnchorPane)FXMLLoader.load(getClass().getResource("SQLHostWindow.fxml"));
MainScreen.getChildren().set(0, HostScreen);
System.out.println(MainScreen.getChildren().get(0));
}
@FXML
public void OpenHostScreen(ActionEvent event) throws IOException{
replaceChild();
}
此外,您不能仅仅因为替换节点而将原始节点的布局参数转移到替换节点。 Pane
经常在子节点的properties
映射中存储布局属性。此地图的内容不会自动复制。
还有一些属性Node
可能与父级相关,具体取决于其类型和properties
中存储的参数:
layoutX
,layoutY
(如果他们不是由父母决定的话)managed
在这种情况下,您很可能只需要复制锚点,大小和位置,这可以通过复制属性并指定layoutX
,layoutY
,prefWidth
和{{}来完成。 1}}。
示例强>
prefHeight