我在项目中编写了一些代码,发现应该将buttonlistener放在public void initialize()
中,否则我将无法使用该按钮。我不知道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();
});
}
答案 0 :(得分:2)
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 Reflection来调用它。这就是为什么您需要使用确切的方法名称的原因。