如何使用相同的模型对象初始化 JavaFX 控制器?
场景
我正在创建一个 GUI,其中多个视图引用同一个模型对象。
我习惯了什么
在 Swing 中,如果我希望所有视图都引用同一模型,我会将模型传递到构造函数中。
我目前在做什么
在JavaFX中,在加载每个视图/控制器后,我通过在视图/控制器(菜单栏,拆分窗格,选项卡等)中使用setter方法来传递模型。我发现这非常俗气和繁琐。此外,我发现它不起作用,因为在某些情况下,我需要模型已经存在于控制器中,然后才能初始化某些控制器小部件。
乏善可陈的替代品
(注意:我引用了以下堆栈溢出问题:
- 控制器文件中的 Javafx 2.0 How-to Application.getParameters() .java
- 传递参数 JavaFX FXML
- 多个 FXML 与控制器,共享对象
-
依赖注入
- 我看过这个网站,http://www.zenjava.com/2011/10/23/javafx-2-0-fxml-and-spring/,我看了一下google Guice,但我没有看到一种简单地为每个JavaFX视图/控制器提供相同模型对象的方法。似乎注入会为每个视图/控制器注入不同的模型。
-
将模型对象另存为公共静态变量
- 这是一个选项,但目前我不喜欢让一个公共静态模型如此开放和可用的想法。显然,我可以把它变成一个私有的静态变量,并有getter和setters,但我也不喜欢这个想法。
-
将参数从调用方传递到控制器
-
我希望每个控制器在其构造函数中加载自身,并且我希望每个自定义控制器自动注入其父控制器。例如,卡片概览选项卡按如下方式加载自身:
public CardOverviewTab() { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("card_overview_tab.fxml")); fxmlLoader.setRoot(content); fxmlLoader.setController(this); try { fxmlLoader.load(); } catch (Exception e) { e.printStackTrace(); } }
-
SingleGameSetup控制器将卡片概述选项卡自动注入到变量中:
public class SingleGameSetupController extends AnchorPane { @FXML private CardOverviewTab cardOverviewTab; // Rest of the class }
-
fxml中包含卡概述选项卡的部分如下所示:
<CardOverviewTab fx:id="cardOverviewTab" />
这样我就不需要担心手动加载控制器,但我仍然有设置模型的问题。
-
-
在 FXMLLoader 上设置控制器
- 此选项类似于我习惯的选项,将模型作为参数传递到构造函数中,但它仍然存在使用FXMLLoader手动加载控制器的问题。
-
事件总线
- 我没有读太多,但从我所读到的内容来看,事件总线似乎不活跃且过时。
-
单身 人士
- 这类似于对控制器可以检索的模型对象进行公共静态引用,但我再次正在寻找更好的解决方案。另外,我不想要单例模型。
我在寻找什么
有没有办法以一种不那么麻烦的方式传递模型对象?我正在寻找一种像将模型传递给构造函数一样简单的方法,但我不想处理通过FXMLLoader手动加载控制器,或者在加载控制器后设置模型。也许有一个类来检索模型是最好的选择,但我问以防万一有更好的方法。