场景
我正在创建一个GUI,其中多个视图引用同一个模型对象。
我习惯的做法
在Swing中,如果我希望所有视图都引用同一模型,则会将模型传递给构造函数。
我目前采取的做法
在JavaFX中,我通过在视图/控制器(菜单栏、拆分窗格、选项卡等)中具有setter方法来传递模型,在每个视图/控制器加载完成后。我认为这种方法很笨拙且繁琐。此外,我发现它行不通,因为在某些情况下,我需要在控制器部件初始化之前就已经存在于控制器中。
平淡无奇的替代方案
(注意: 我参考了下列stackoverflow问题:
- Javafx 2.0 How-to Application.getParameters() in a Controller.java file
- Passing Parameters JavaFX FXML
- Multiple FXML with Controllers, share object
依赖注入
- 我查看了这个网站http://www.zenjava.com/2011/10/23/javafx-2-0-fxml-and-spring/,还略微了解了google Guice,但我没有找到一个简单的方法来为每个JavaFX视图/控制器提供相同的模型对象。它似乎是为每个视图/控制器注入不同的模型。
将模型对象保存为公共静态变量
- 这是一个选项,但目前我不喜欢让一个公共静态模型变得如此开放和可用。显然,我可以将其作为私有静态变量,并拥有getter和setter,但我也不太喜欢这种想法。
从调用者向控制器传递参数
我希望每个控制器在其构造函数中加载自身,并且希望每个自定义控制器自动注入其父控制器。例如,卡片概述选项卡会像这样加载自身:
而 SingleGameSetup 控制器会自动将卡牌概述选项卡注入到一个变量中: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(); } }
public class SingleGameSetupController extends AnchorPane { @FXML private CardOverviewTab cardOverviewTab; // Rest of the class }
包含卡片概览标签页的fxml部分如下所示:
<CardOverviewTab fx:id="cardOverviewTab" />
这种方式可以避免手动加载控制器的问题,但是我仍然需要解决设置模型的问题。
在FXMLLoader上设置一个控制器
- 这个选项类似于我习惯的方式,将模型作为参数传递到构造函数中,但仍然需要手动使用FXMLLoader加载控制器。
事件总线
- 我没有仔细研究过这个,但从我所读的内容来看,事件总线似乎已经不再活跃和过时了。
单例模式
- 这类似于拥有一个公共静态引用的模型对象,控制器可以检索该对象,但我仍在寻找更好的解决方案。此外,我不想要一个单例模型。
我的期望
有没有一种比较简便的方法来传递模型对象?我正在寻找一种像将模型传递给构造函数那样简单的方法,但我不想通过手动加载FXMLLoader来处理控制器,或者在控制器加载后设置模型。也许拥有一个类来检索模型是最好的选择,但我仅是询问是否有更好的方法。