初始化控制器和FXML链接控制器有什么区别?

3
直到最近我才知道你可以在FXML文件中使用fx:controller设置控制器,因此我一直依赖FXMLLoadersetController来管理链接。
那么,是否有任何理由使用其中一个,例如某种情况下overrideable initialize()方法会很有用?
1个回答

5

对于设置fxml文件的控制器,这两种方法在功能上没有区别。但是,在何时使用它们方面有一些微小的区别。

  1. 如果您的控制器在调用其自己的initialize()之前不需要任何外部对象来初始化其状态,换句话说,您的控制器类具有无参构造函数(或者您调用FXMLLoadersetControllerFactory()并为其提供如何初始化控制器的实现)并且完全由FXMLLoader管理,则可以使用fx:controller并将其设置在fxml文件本身中。 FXMLLoader将加载控制器,并在存在此方法时调用其initialize()。这是链接控制器和fxml文件的默认方式。

  2. 如果您的控制器具有带有至少1个参数的构造函数,或者在控制器的initialize()中需要访问必须在控制器类之外初始化的字段,则您需要手动管理控制器。您可以像处理其他Java类一样创建一个实例,初始化所需内容,然后才调用setController()将您的控制器与fxml文件链接起来。此技术通常用于自定义控制器。

更多详情请查看:http://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html#custom_components


2
只要在FXMLLoader上设置一个控制器工厂,您实际上可以使用任何控制器与fx:controller一起使用。然后由工厂负责实例化控制器类。不需要无参数构造函数。 - Prometheus
谢谢您指出这一点。现在已经更新了答案。 - AlmasB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接