如何将fxml文件适合ChildAnchorPane?

时间:2016-10-15 07:45:23

标签: java javafx javafx-8 scenebuilder

我正在处理我的项目,该项目有两个 fxml 文件,我设法以两种方式从MainController打开两个fxml文件,如

  

通过单击按钮

执行的操作
  1. 创建并打开新的舞台,场景和加载fxml文件。
  2. 用fxml替换子AnchorPane。
  3. 问题在于第二种方式:fxml文件根据我已在主要FXML文件中使用坐标定义的子Anchor Pane不合适,它出现在primaryStage的左上角,并且是有什么方法可以解决这个问题吗?

    请按照屏幕截图说明我的应用程序的GUI视图。 enter image description here

      

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

1 个答案:

答案 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中存储的参数:

  • layoutXlayoutY(如果他们不是由父母决定的话)
  • managed
  • 翻译,旋转,缩放
  • 尺寸
  • ...

在这种情况下,您很可能只需要复制锚点,大小和位置,这可以通过复制属性并指定layoutXlayoutYprefWidth和{{}来完成。 1}}。

示例

prefHeight