【问题标题】:what does initialize() mean in javafx?javafx中的initialize()是什么意思?
【发布时间】:2018-07-18 01:20:08
【问题描述】:

我在我的项目中写了一些代码,我发现我应该把我的按钮监听器放在public void initialize() ,否则我不能使用按钮。我不知道 javafx 中的 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();
    });
}

【问题讨论】:

    标签: javafx initialization


    【解决方案1】:

    initialize() 方法用于初始化任何控件,尤其是当它无法通过 FXML 完成时。这方面的一个例子是setCellFactory()setCellValueFactory()。如果您没有要初始化的内容,则无需在控制器类中放置 initialize() 方法。

    有些人认为可以在控制器类构造函数中进行初始化,但那是错误的初始化位置。这是因为 FXML 注入仅在控制器类被实例化后发生。 FXML 注入发生在initialize() 被调用之前,这使得在initialize() 中执行初始化是安全的。如果您使用注入控件的引用(例如@FXML private Button button),则在构造函数中初始化将为您提供NullPointerException

    在 JavaFX 2.0 中,如果控制器需要初始化任何内容,则需要控制器类来实现 Initializable 接口。如果你添加了initialize()而不实现接口,则不会进行初始化。

    这在 JavaFX 8.0 中已更改。控制器类将不再需要实现Initializable 接口,但您可以仍然选择这样做。唯一需要注意的是,如果initialize() 是非公开的,则需要添加@FXML 注释。如果initialize()方法是public,那么你可以跳过注解。

    我建议保留initialize() 方法private(或protected,这很少有用)。保持initialize() private 使得初始化多次发生不太可能,这可能会导致意外行为。

    小更新

    如果您想知道initialize() 在没有实现Initializable 接口时如何被调用,它是通过使用Java 反射来调用的。这就是为什么您需要使用确切的方法名称。

    【讨论】:

    • 另外,当使用非public 字段和/或方法时你使用模块(Java 9+)你必须opens你的控制器的包到至少javafx.fxml.
    • @Slaw 我不知道,没有机会从 8 升级,因为我的项目使用了 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多