JavaFX,FXML和控制器:切换场景,维护场景数据

时间:2016-08-06 12:09:22

标签: java design-patterns javafx fxml controllers

你好程序员和建筑师!
我是新来的......我想我的英语可能......太可怕了! :-D 所以...请小心我......拜托。

我有一个关于JavaFX,FXML以及切换场景的各种方法的架构问题,在所有场景中保存数据...... 我使用了个人解决方案,我需要知道它是否是一个可接受的解决方案(在架构层面)。

我会尝试解释我的解决方案 我使用了一种"反向"观察者模式:对每个观察者使用许多观察者,我使用了一个观察者(一个特定的类)和许多可观察者(所有控制者)。
因此,当它改变场景时,当前场景的控制器会通知观察者这样做。观察者删除旧场景并加载新场景。

一些细节。
我创建了一个名为SceneObserver的类,它实现了java.util.Observer enter image description here
我使用SceneObserver来:

  • 将SceneObserver注册为所有控制器的观察者
  • 加载特定的FXML文件
  • 创建一个只有一个AnchorPanel作为根元素的新场景ad使用root.getChildren()。add()方法将根元素追加到加载的FXML
  • 为FXMLLoader设置一个特定的控制器(我没有使用" fx:controller"在各种FXML中。)

我的所有控制器都扩展了java.util.Observable(这是一个例子) enter image description here
当场景中发生某种情况并且需要切换场景时,场景会向SceneObserver通知更改(观察者模式),SceneObserver会破坏旧场景并加载新场景。 换句话说,我只使用一个观察者来观察所有控制器(观察模式的反转)。
一切正常,但我知道这还不够!

所以,问题是:在架构层面发言,这是一个可接受的解决方案吗?

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

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

  1. 仅加载必要的FXML(更快速的应用程序)
  2. 让控制器解耦
  3. 感谢所有人......对不起我的英语: - (

1 个答案:

答案 0 :(得分:1)

嗯...

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

<击> https://web.archive.org/web/20160316234709/
<击> https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1
https://github.com/google/guava/wiki/EventBusExplained
http://eventbus.org/

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

我的目标是在我的JavaFX应用程序中解耦各种控制器,从而可以在之间进行通信。
而不是使用事件处理程序,参数或过时的事件总线,似乎一个简单的路由器模式可以解决这个问题。 每个控制器必须知道路由器(显然是一个单独的),路由器必须知道每个控制器。通过这种方式,我简单地将多对多的阶级关系转化为一对多的关系而没有任何关于#34;太神奇的&#34;我可以在控制器之间发送各种消息。在小:
在路由器中,我为每个控制器和set方法声明一个属性,以便准确链接控制器的实例,如下所示:

public class Router {
    private MainCtrl mainCtrl;
    ...
    protected void setMainCtrl(MainCtrl mainCtrl) {
        this.mainCtrl = mainCtrl;
    }
}

然后,在每个控制器中我声明一个Router对象(router),并在每个控制器的initialize()方法中我写这个(路由器必须是一个单独的!):

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

这就是全部。