2015-08-08 29 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。 加载(“...”);' –