3 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
FXML是MVC模式的一種簡單形式。FXML文件是一個(gè)視圖,Controller很明顯,錯(cuò)過了什么?模型-一個(gè)用于存儲相對于當(dāng)前視圖的所有數(shù)據(jù)的位置,因此可以在控制器之間共享國家/地區(qū)數(shù)據(jù)。
1.引入模型的一種可能方法是“上下文”。讓我們考慮一個(gè)案例,那么整個(gè)項(xiàng)目只有一個(gè)模型,因此可以以Singleton的形式擁有全局上下文
public class Context {
private final static Context instance = new Context();
public static Context getInstance() {
return instance;
}
private Country country = new Country();
public Country currentCountry() {
return country;
}
}
您的SampleController將進(jìn)行以下更改:
@Override
public void initialize(URL url, ResourceBundle rb) {
Context.getInstance().currentCountry().setCountry("Belgium");
}
并SubController1可以以相同的方式訪問它:
@Override
public void initialize(URL url, ResourceBundle rb) {
System.out.println(Context.getInstance().currentCountry().getCountry());
}
2.另一種方法是將上下文傳遞給SubController1您,然后加載它的xml。如果您不想擁有應(yīng)用程序全局模型,它將更好地工作。因此,創(chuàng)建類似的Context類,但不包含實(shí)例字段,并且:
public class Sub1Controller implements Initializable {
private Context context;
public void setContext(Context context) {
this.context = context;
// initialize country dependent data here rather then in initialize()
}
}
在中設(shè)置上下文SampleController:
Context currentContext = new Context();
@Override
public void initialize(URL url, ResourceBundle rb) {
currentContext.currentCountry().setCountry("Belgium");
}
@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
URL url = getClass().getResource("Sub1.fxml");
FXMLLoader fxmlloader = new FXMLLoader();
fxmlloader.setLocation(url);
fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());
pContent.getChildren().clear();
pContent.getChildren().add((Node) fxmlloader.load(url.openStream()));
// here we go
((Sub1Controller)fxmlloader.getController()).setContext(currentContext);
}

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
感謝謝爾蓋一百萬次,終于一切都說得通了。這是我第一次必須創(chuàng)建一個(gè)大型應(yīng)用程序,但是我仍在努力“構(gòu)建”它。我還想問另一個(gè)安全性問題,但是我不確定這是否是問這個(gè)問題的正確網(wǎng)站(它與代碼無關(guān))
添加回答
舉報(bào)