我在我的项目中写了一些代码,我发现我应该把我的buttonlistener放在public void initialize(),否则我不能使用button。我不知道 javafx 中的 initialize() 是什么意思,为什么我不能把它改成另一个方法名?
这是我代码中的 initialize 方法,我没有实现 Initializable。那么这在javafx 中是什么意思呢?
public void initialize() {
weight_number1.setOnAction(e -> number(1));
weight_number2.setOnAction(e -> number(2));
weight_number3.setOnAction(e -> number(3));
weight_number4.setOnAction(e -> number(4));
weight_number5.setOnAction(e -> number(5));
weight_number6.setOnAction(e -> number(6));
weight_number7.setOnAction(e -> number(7));
weight_number8.setOnAction(e -> number(8));
weight_number9.setOnAction(e -> number(9));
weight_number0.setOnAction(e -> number(0));
weight_numberCE.setOnAction(e -> symbol(1));
weight_numberLeft.setOnAction(e -> symbol(2));
weight_numberp.setOnAction(e -> symbol(3));
weight_box1.setOnAction((event) -> {
change();
showans();
});
weight_box2.setOnAction((event) -> {
change();
showans();
});
}
Run Code Online (Sandbox Code Playgroud)
该initialize()方法用于初始化任何控件,尤其是当它无法通过 FXML 完成时。这方面的一个例子是setCellFactory()和setCellValueFactory()。如果你没有什么要初始化的,那么你不需要initialize()在你的控制器类中放置一个方法。
有些人认为他们可以在控制器类构造函数中进行初始化,但那是错误的初始化位置。这是因为 FXML 注入仅在控制器类被实例化之后发生。FXML 注入发生在initialize()被调用之前,这使得在initialize(). NullPointerException如果您使用了注入控件的引用(例如@FXML private Button button),则在构造函数中初始化将为您提供。
在 JavaFX 2.0 中,Initializable如果控制器有任何要初始化的内容,则需要控制器类来实现接口。如果在initialize()没有实现接口的情况下添加,则不会发生初始化。
这在 JavaFX 8.0 中有所改变。控制器类将不再需要实现Initializable的接口,但您可能仍然选择这样做。唯一需要注意的是,@FXML如果initialize()是非公开的,则需要添加注释。如果initialize()方法是public,那么您可以跳过注释。
我建议保留该initialize()方法private(或protected,这很少有用)。保持initialize() private使得它不太可能对发生初始化一次以上,这有可能导致意外的行为。
如果您想知道initialize()当它没有实现Initializable接口时如何被调用,它是通过使用 Java 反射来调用的。这就是为什么您需要使用确切的方法名称。