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”)
我的所有控制器都扩展了java.util.Observable(这是一个示例)。

当场景中发生某种类型的情况并且需要切换场景时,场景会通知SceneObserver更改(观察者模式),SceneObserver会销毁旧场景并加载新场景。 换句话说,我只使用一个观察者来观察所有控制器(与观察模式相反)
所有这些都有效,但我知道这还不够

因此,问题是:从架构层面来说,这是一个可接受的解决方案吗?

我知道,这不是唯一的方法,当然还有其他更好的方法,但是。。。这个怎么样

我为什么使用此解决方案?
有两个原因:

  • 仅加载必要的FXML(更快速的应用程序)
  • 保持控制器解耦
  • 感谢所有人和。。。对不起我的英语:(

    之后,我阅读并测试了不同的解决方案,我建议阅读:





    我决定用一种更简单的方法来实现我自己的解决方案:路由器模式

    我的目标是解耦JavaFX应用程序中的各种控制器,让它们之间的通信成为可能
    相反,使用事件处理程序、参数或过时的事件总线,一个简单的路由器模式似乎可以解决这个问题。 每个控制器都必须知道路由器(显然是单例),路由器必须知道每个控制器。通过这种方式,我简单地将多对多类关系转换为一对多类关系,而不需要任何“太神奇”的东西,我可以在控制器之间发送各种消息。简单地说:
    在路由器中,我为每个控制器声明一个属性和一个set方法,以便精确链接控制器实例,如下所示:

    public class Router {
        private MainCtrl mainCtrl;
        ...
        protected void setMainCtrl(MainCtrl mainCtrl) {
            this.mainCtrl = mainCtrl;
        }
    }
    
    然后,在每个控制器中,我声明一个路由器对象(
    Router
    ),并在每个控制器的
    initialize()
    方法中写入(路由器必须是单例!):

    就这些

    public void initialize() {
        router.setMainCtrl(this);
        ...
    }