类的默认行为。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()在指定的类上(有效地调用它的非参数构造函数)。