如何在窗格内加载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()); ..
。