我想在JavaFX中创建一个应用程序来创建一个MVPC模式 . 我的想法如下:
-
VIEW:简单的FXML文件
-
CONTROLLER:包含VIEW中定义的事件处理函数,更新演示模型
-
演示模型:简单数据,包含可观察对象(ObjectProperty,ObservableList等)
-
PRESENTER:包含FXML文件中由fx:id定义的JavaFX节点,将这些节点绑定到PRESENTATION MODEL中的可观察对象,并处理其他演示功能,如弹出窗口 . 这将是JavaFX应用程序 .
您可以注意到我的目标是将FXML对象(如@FXML Label标签)与PRESENTER和FXML事件处理程序方法(如@FXML submit(Action event e){})TO CONTROLLER分开 .
简而言之:我有一个FXML文件,其元素如fx:id =“passwordField”和事件处理程序如onAction =“#browseSbx” . 我想有两个单独的.java控制器,一个用于包含fx:id的对象,另一个用于处理事件方法 .
我的问题:这有什么“干净”的方法吗?或者我的计划中有任何概念错误吗?
谢谢!
1 回答
只是关于可用性的说明:如果你完全将"actions"与"view"分开(即如果你的控制器真的对UI组件一无所知),事情可能会有点复杂 . 例如,大多数时候按钮操作都要查看文本字段的状态等 . 您当然可以通过使用演示者将文本字段中的文本绑定到演示模型中的数据来实现此目的,以及然后让控制器调用引用该状态的模型上的方法 . 那么问题是控制器方法除了在表示模型上调用等效方法之外基本上什么都不做;你最终会得到一个真的太薄而且没有减轻其重量的层,而且这个架构看起来过于设计 .
也就是说,如果你想尝试这个,这里有一种方法可行 .
这里的主要障碍是
FXMLLoader
有一个与之关联的controller
实例 . 当它加载FXML时,它都会将具有fx:id
属性的元素注入控制器,并将控制器中的"handler"方法与通过FXML中的onXXX
属性指定的事件处理程序相关联 .你可以使用的方法是使用
FXMLLoader
的namespace
,这是一个从fx:id
值到相应元素的映射 . 因此,我认为可行的方法是使用默认加载过程将处理程序与控制器关联,然后使用一堆反射从名称空间中的值初始化演示者中的@FXML
注释字段 .后半部分看起来像:
当然,您的演示者还需要执行一些绑定,因此我们需要安排在注入字段后调用的方法 . 这是通过
FXMLLoader
为控制器类完成的,方法是调用任何名为initialize()
的public
或@FXML
注释方法;因此,如果您希望演示者具有相同的功能,则可以执行以下操作:(您可以在此处使用其他方案,例如使用
javax.inject
注释并简单地调用任何@PostConstruct
注释方法 . )因此,包含
FXMLLoader
并执行这些附加步骤的通用装载类可能如下所示 . 这还有一些额外的功能:由于你的控制器和你的演示者都需要访问模型,它会注入任何@FXML
-annotated字段,其类型与模型实例的模型类型相同 . (同样,你可以根据需要修改它 . )正如你所看到的,这个功能依赖于一大堆反思:它基本上是在实现一个微框架 .通过查看afterburner.fx的源代码来激发这样做的技巧 .
这是使用这个类的快速测试: