2015-08-08 31 views
1

我想將FXML視圖加載到我的程序中並保存視圖供以後使用。Java FXML加載視圖供以後使用

我目前有一個窗格可以切換出FXML文件。

@FXML private Pane contentPane; 
@FXML 
public void toHome() { 
    contentPane.getChildren().setAll(FXMLLoader.load(getClass().getResource("../fxml/Home.fxml"))); 
} 
@FXML 
public void toBrowse() { 
    contentPane.getChildren().setAll(FXMLLoader.load(getClass().getResource("../fxml/Browse.fxml"))); 
} 

的事情是,我對每一個新FXML頁的文本字段,當我切換頁面,我不希望它來創建一個新的FXML參考,並在文本字段中丟失數據。我怎樣才能保留我設定的原始頁面?

感謝,

巴特

回答

2

我認爲你可以在這裏使用一個緩存。所以基本上,將加載的fxml存儲在一個hashmap中。

如果它不在那裏,加載它並將其存儲到散列映射中,否則從散列映射中獲取並使用它。這個post解釋說緩存加載的FXML對象是很好的,例如當涉及到性能時,請參閱那裏提到的「緩存FXML加載節點樹和控制器」一章。

private static Map<String, Object> map = new HashMap<>(); 

@FXML 
private Pane contentPane; 

@FXML 
public void toHome() throws IOException { 
    Object loaded = map.get("home"); 
    if (loaded == null) { 
     loaded = FXMLLoader.load(getClass().getResource("../fxml/Home.fxml")); 
     map.put("home", loaded); 
    } 

    contentPane.getChildren().setAll((Node) loaded); 
} 

(我不得不插入強制轉換爲Node,否則就沒有編譯。我不知道這是否是總是正確的)

+0

地圖可以地圖<字符串,節點>類型。 –

+0

根據http://stackoverflow.com/questions/13754214/how-to-use-fxmlloader-load-javafx-2可能有各種返回類型的加載方法,所以我認爲這取決於具體的FXML文件 – beosign

+1

幾乎在所有情況下,fxml文件都包含一些層次結構的節點。如果頂層節點是佈局之一,那麼將所有類型的佈局轉換爲「Parent」是安全的。更加安全的是投到'Node'。因爲它是JavaFX中的父類和所有UI控件的超類。此外,而不是轉換,所需的類型可以指定爲「父親= FXMLLoader。 加載(「...」);' –