2015-01-08 119 views
2

我想弄清楚是否有办法得到给定节点的FXML的引用。JavaFX 8有办法从节点获取FXML引用吗?

比如我动态加载的观点 - 认为我在目前的控制器中引用的窗格:

private void openView() { 
    FXMLLoader loader = new FXMLLoader(); 
    Parent node = loader.load(this.getClass().getResource("MyView.fxml").openStream()); 
    pane.getChildren().add(node); 
    node.requestFocus(); 
} 

我想保存这观点是开放的,这样我可以重新启动他们下一次的窗口打开。事情是这样的:

private void saveOpenViews() { 
    pane.getChildren().forEach(child -> { 
     String fxmlLocation = child.getFXML(); 
     etc.... 
    } 
} 

我似乎无法找到一个办法让回到坚持什么是开放的......希望有一种方式,比在别的地方手动跟踪等。

谢谢。

回答

1

当您从fxml加载节点时,将相关的fxml信息存储在节点userData中,然后在需要知道该节点与哪个fxml相关时查找userdata。

private void openView() { 
    FXMLLoader loader = new FXMLLoader(); 
    URL fxmlLocation = this.getClass().getResource("MyView.fxml"); 
    Parent node = loader.load(fxmlLocation.openStream()); 
    node.setUserData(fxmlLocation); 
    pane.getChildren().add(node); 
    node.requestFocus(); 
} 

private void saveOpenViews() { 
    pane.getChildren().forEach(child -> { 
     URL fxmlLocation = (URL) child.getUserData(); 
     etc.... 
    } 
} 
+0

当使用FXML时,您通常会拥有一个控制器类。创建一个包含所需getter和setter方法的抽象控制器类。你所有的控制器都会扩展这个类。然后,您可以使用fxmlLoader.getController()访问控制器,并调用FXML位置的setter。您可以将打开的视图的控制器存储在List中。一旦保存方法被调用,你只需要迭代你的控制器并获取xml。如果您想要更灵活地定义视图控制器,您可以使用DataFX(http://www.guigarage.com/2014/05/datafx-8-0-tutorials/) –

+0

感谢您提供Hendrik信息。可能最好提供答案而不是评论。 – jewelsea

相关问题