JavaFX、FXML和控制器:切换场景、维护场景数据
程序员和架构师大家好JavaFX、FXML和控制器:切换场景、维护场景数据,java,design-patterns,javafx,fxml,controllers,Java,Design Patterns,Javafx,Fxml,Controllers,程序员和架构师大家好 我是新来的。。。我想我的英语可以。。。太可怕了-D 所以小心我。。。求你了 我有一个关于JavaFX、FXML以及切换场景、在所有场景之间保存数据的各种方法的架构问题。。。 我使用了个人解决方案,我需要知道它是否是可接受的解决方案(在架构级别) 我将尝试解释我的解决方案。 我使用了一种观察者模式的“反向”:相反,我使用了一个观察者(一个特定的类)和多个观察者(所有控制器),为每个观察者使用了多个观察者 所以,当需要更改场景时,当前场景的控制器会通知观察者这样做。观察者删除旧
我是新来的。。。我想我的英语可以。。。太可怕了-D 所以小心我。。。求你了 我有一个关于JavaFX、FXML以及切换场景、在所有场景之间保存数据的各种方法的架构问题。。。 我使用了个人解决方案,我需要知道它是否是可接受的解决方案(在架构级别) 我将尝试解释我的解决方案。
我使用了一种观察者模式的“反向”:相反,我使用了一个观察者(一个特定的类)和多个观察者(所有控制器),为每个观察者使用了多个观察者 所以,当需要更改场景时,当前场景的控制器会通知观察者这样做。观察者删除旧场景并加载新场景。
一些细节。
我创建了一个名为SceneObserver的类,它实现了java.util.Observer。
我使用SceneObserver是为了:
- 将SceneObserver注册为我的所有控制器的观察者
- 加载指定的FXML文件
- 创建一个新场景,仅使用Anchopanel作为根元素,使用root.getChildren().add()方法将加载的FXML附加到根元素
- 为FXML加载器设置特定的控制器(我没有在各种FXML中使用“fx:controller”)
当场景中发生某种类型的情况并且需要切换场景时,场景会通知SceneObserver更改(观察者模式),SceneObserver会销毁旧场景并加载新场景。 换句话说,我只使用一个观察者来观察所有控制器(与观察模式相反)
所有这些都有效,但我知道这还不够 因此,问题是:从架构层面来说,这是一个可接受的解决方案吗? 我知道,这不是唯一的方法,当然还有其他更好的方法,但是。。。这个怎么样 我为什么使用此解决方案?
有两个原因:
我决定用一种更简单的方法来实现我自己的解决方案:路由器模式 我的目标是解耦JavaFX应用程序中的各种控制器,让它们之间的通信成为可能
相反,使用事件处理程序、参数或过时的事件总线,一个简单的路由器模式似乎可以解决这个问题。 每个控制器都必须知道路由器(显然是单例),路由器必须知道每个控制器。通过这种方式,我简单地将多对多类关系转换为一对多类关系,而不需要任何“太神奇”的东西,我可以在控制器之间发送各种消息。简单地说:
在路由器中,我为每个控制器声明一个属性和一个set方法,以便精确链接控制器实例,如下所示:
public class Router {
private MainCtrl mainCtrl;
...
protected void setMainCtrl(MainCtrl mainCtrl) {
this.mainCtrl = mainCtrl;
}
}
然后,在每个控制器中,我声明一个路由器对象(Router
),并在每个控制器的initialize()
方法中写入(路由器必须是单例!):
就这些
public void initialize() {
router.setMainCtrl(this);
...
}