初始化控制器和 FXML 链接控制器之间的区别?
Difference between initialized controllers and FXML linked controllers?
直到最近我才知道您可以在 FXML
文件中使用 fx:controller
设置控制器,所以我一直依赖 FXMLLoader's
setController
来管理链接。
那么,是否有任何理由像 overrideable initialize()
方法有用的特定情况一样使用一个而不是另一个?
为 fxml 文件设置控制器的两种方法在功能上没有区别。但是,在何时使用这方面有细微的区别。
如果你的控制器在调用它自己的 initialize()
之前不需要任何外部对象来初始化它的状态,换句话说你的控制器 class 有一个 no-arg constructor
(或者您调用 FXMLLoader
的 setControllerFactory()
并为其提供控制器应如何初始化的实现)并且完全由 FXMLLoader
管理,然后您选择 fx:controller
并将其设置在 fxml 文件本身中。 FXMLLoader
将加载控制器并调用它的 initialize()
如果有这样的方法。这是 linking 控制器和 fxml 文件的默认方式。
如果你的控制器有一个带有 at least 1 argument
的构造函数或在控制器的 initialize()
中,它需要访问必须在外部初始化的字段(不在控制器中 class), 然后你手动管理控制器。您创建它的一个实例,就像任何其他 Java class 一样,初始化所需的内容,然后才使用 fxml 文件调用 setController()
到 link 您的控制器。此技术通常与自定义控制器一起使用
直到最近我才知道您可以在 FXML
文件中使用 fx:controller
设置控制器,所以我一直依赖 FXMLLoader's
setController
来管理链接。
那么,是否有任何理由像 overrideable initialize()
方法有用的特定情况一样使用一个而不是另一个?
为 fxml 文件设置控制器的两种方法在功能上没有区别。但是,在何时使用这方面有细微的区别。
如果你的控制器在调用它自己的
initialize()
之前不需要任何外部对象来初始化它的状态,换句话说你的控制器 class 有一个no-arg constructor
(或者您调用FXMLLoader
的setControllerFactory()
并为其提供控制器应如何初始化的实现)并且完全由FXMLLoader
管理,然后您选择fx:controller
并将其设置在 fxml 文件本身中。FXMLLoader
将加载控制器并调用它的initialize()
如果有这样的方法。这是 linking 控制器和 fxml 文件的默认方式。如果你的控制器有一个带有
at least 1 argument
的构造函数或在控制器的initialize()
中,它需要访问必须在外部初始化的字段(不在控制器中 class), 然后你手动管理控制器。您创建它的一个实例,就像任何其他 Java class 一样,初始化所需的内容,然后才使用 fxml 文件调用setController()
到 link 您的控制器。此技术通常与自定义控制器一起使用