初始化控制器和 FXML 链接控制器之间的区别?

Difference between initialized controllers and FXML linked controllers?

直到最近我才知道您可以在 FXML 文件中使用 fx:controller 设置控制器,所以我一直依赖 FXMLLoader's setController 来管理链接。

那么,是否有任何理由像 overrideable initialize() 方法有用的特定情况一样使用一个而不是另一个?

为 fxml 文件设置控制器的两种方法在功能上没有区别。但是,在何时使用这方面有细微的区别。

  1. 如果你的控制器在调用它自己的 initialize() 之前不需要任何外部对象来初始化它的状态,换句话说你的控制器 class 有一个 no-arg constructor(或者您调用 FXMLLoadersetControllerFactory() 并为其提供控制器应如何初始化的实现)并且完全由 FXMLLoader 管理,然后您选择 fx:controller 并将其设置在 fxml 文件本身中。 FXMLLoader 将加载控制器并调用它的 initialize() 如果有这样的方法。这是 linking 控制器和 fxml 文件的默认方式。

  2. 如果你的控制器有一个带有 at least 1 argument 的构造函数或在控制器的 initialize() 中,它需要访问必须在外部初始化的字段(不在控制器中 class), 然后你手动管理控制器。您创建它的一个实例,就像任何其他 Java class 一样,初始化所需的内容,然后才使用 fxml 文件调用 setController() 到 link 您的控制器。此技术通常与自定义控制器一起使用

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