3 回答

TA貢獻1859條經驗 獲得超6個贊
FXML是MVC模式的一種簡單形式。FXML文件是一個視圖,Controller很明顯,錯過了什么?模型-一個用于存儲相對于當前視圖的所有數據的位置,因此可以在控制器之間共享國家/地區數據。
1.引入模型的一種可能方法是“上下文”。讓我們考慮一個案例,那么整個項目只有一個模型,因此可以以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將進行以下更改:
@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。如果您不想擁有應用程序全局模型,它將更好地工作。因此,創建類似的Context類,但不包含實例字段,并且:
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()
}
}
在中設置上下文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貢獻1853條經驗 獲得超9個贊
感謝謝爾蓋一百萬次,終于一切都說得通了。這是我第一次必須創建一個大型應用程序,但是我仍在努力“構建”它。我還想問另一個安全性問題,但是我不確定這是否是問這個問題的正確網站(它與代碼無關)
添加回答
舉報