2015-01-08 114 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

相關問題