类的默认行为。FXMLLoader是创建控制器类的新实例,并使用该实例作为控制器。

具体来说,FXMLLoader做类似于:读取根FXML元素。如果控制器已经存在,则抛出异常,否则创建指定类的实例。

1并将其设置为控制器如果根fxml元素具有

fx:controller属性,那么

继续解析FXML文件。如果元素具有

fx:id属性,并且存在控制器(通过任何机制),将这些字段注入控制器。类似地,将事件处理程序注册为对控制器实例中的方法的调用。

调用

initialize()在控制器上,如果存在控制器,并且它具有这样的方法。

所以,你问的问题:应用程序类可以是控制器类吗?

是的,但这可能是个糟糕的主意。如果您只是指定Application作为控制器类的子类使用fx:controller的第二个实例。Application子类被创建,@FXML-在第二个实例上注入带注释的字段,并且initialize()方法在第二个实例上调用。显然,@FXML-字段从未在其上初始化的实例上初始化start(...)被调用,并且initialize()方法从未在该实例上调用。

你可能的意思是:启动时创建的应用程序类实例可以用作控制器吗?

这个问题的答案也是肯定的,除了你打算立即放弃的非常小的演示程序之外,这也可能是一个非常糟糕的想法。你会这样做的public class MyApp extends Application {

@FXML
private Node someNode ;
public void initialize() {
// do something with someNode
}
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/fxml/file.fxml"));
loader.setController(this);
Parent root = loader.load();
primaryStage.setScene(new Scene(root));
primaryStage.show();
}}

注意,要使用这段代码,您的FXML文件绝不能有fx:controller属性。

这方面的问题是,您没有分离,也没有灵活性。(例如,如果您在某个地方创建了在FXML文件中定义的视图的第二个实例,那么您将得到第二个实例。Application子类实例,它充其量是违反直觉的(一个应用程序和两个应用程序)。Application)

因此,我主张在基本上每种情况下都为控制器使用一个单独的类。这个Application子类应该包含最少的代码,并且应该只用于启动应用程序。

1这个步骤实际上要复杂一些。如果在fx:controller属性,并且不存在控制器,则FXMLLoader支票controllerFactory..如果存在,则将控制器设置为传递指定的Class到controllerFactory氏call()方法,否则将通过调用newInstance()在指定的类上(有效地调用它的非参数构造函数)。