javafx中的initialize()是什么意思?

时间:2018-07-18 01:20:09

标签: javafx initialization

我在项目中编写了一些代码,发现应该将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();
    });
}

1 个答案:

答案 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来调用它。这就是为什么您需要使用确切的方法名称的原因。