如何在窗格内加载fxml文件?

在此处输入图像描述

如果我们有一个Stage那么Scene包括2个Pane第一个Pane包含Button而第二个Pane是空的,我们可以在第二个窗格内加载其他fxml文件吗?

 fxml1: VBox |_Pane1-->Button |_Pane2 /////////////// fxml2: Pane--> Welcome to fxml 2 "when we click the button load the fxml2 inside Pane2 of fxml1" 

然后点击

在此处输入图像描述


====我终于在尝试后找到了这个作品!====谢谢你们

 @FXML Pane secPane; public void loadFxml (ActionEvent event) { Pane newLoadedPane = FXMLLoader.load(getClass().getResource("/application/fxml2.fxml")); secPane.getChildren().add(newLoadedPane); } 

我终于在尝试后找到了这个作品!

 @FXML Pane secPane; public void loadFxml (ActionEvent event) { Pane newLoadedPane = FXMLLoader.load(getClass().getResource("/application/fxml2.fxml")); secPane.getChildren().add(newLoadedPane); } 

只更换控制器类中的字段不会更改场景图。

secPane只是对场景图中节点的引用。

如果secPane只是一个占位符,您可以在父级子列表中替换它:

 public void loadFxml (ActionEvent event) { // load new pane Pane newPane = FXMLLoader.load(getClass().getResource("/application/Login2.fxml")); // get children of parent of secPane (the VBox) List parentChildren = ((Pane)secPane.getParent()).getChildren(); // replace the child that contained the old secPane parentChildren.set(parentChildren.indexOf(secPane), newPane); // store the new pane in the secPane field to allow replacing it the same way later secPane = newPane; } 

当然,这假定getClass().getResource("/application/Login2.fxml")产生正确的资源并且不返回null (如果没有给定名称的资源可用,则会发生这种情况)

你可以实现这样的事情:

  public void start(Stage primaryStage) throws IOException { primaryStage.setTitle("Title"); primaryStage.setScene(createScene(loadMainPane("path_of_your_fxml"))); primaryStage.show(); } private Pane loadMainPane(String path) throws IOException { FXMLLoader loader = new FXMLLoader(); Pane mainPane = (Pane) loader.load( getClass().getResourceAsStream(path)); return mainPane; } private Scene createScene(Pane mainPane) { Scene scene = new Scene(mainPane); return scene; } 

然后,您可以创建一个单独的类调用导航来存储所有fxml路径:

 public class Navigator { private final String P1; private final String P2; //then you can implement getters... public String getP1() { return P1; } public String getP2() { return p2; } private static FxmlController Controller; public static void loadPane(String fxml) { try { FxmlController.setPane( (Node) FXMLLoader.load(Navigator.class.getResource(fxml))); } catch (IOException e) { e.printStackTrace(); } } public Navigator() throws IOException { this.P1 = "p1.fxml"; this.P2 = "p2.fxml";} 

然后,您可以在按钮中加载窗格,如下所示:

 @FXML private void btnAction(ActionEvent event) throws IOException { Navigator.load(new Navigator().getP1()); ..