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个赞
感谢谢尔盖一百万次,终于一切都说得通了。这是我第一次必须创建一个大型应用程序,但是我仍在努力“构建”它。我还想问另一个安全性问题,但是我不确定这是否是问这个问题的正确网站(它与代码无关)
添加回答
举报