gpt4 book ai didi

JavaFX,标签空指针异常

转载 作者:行者123 更新时间:2023-12-05 02:21:06 25 4
gpt4 key购买 nike

我目前正在编写的程序遇到以下问题,我已经在互联网上搜索过,但我找不到任何可以帮助我理解以下问题的东西

所以在另一个类中,我编写了一个方法,只要单击搜索按钮就会执行此方法,该方法如下所示:

public void searchButton(){
try {
new SearchController().display();
} catch (IOException e) {
e.printStackTrace();
}
}

然后 SearchController 类看起来像这样(我在这里简化了它):

public class SearchController {

@FXML
private Button cancelButton;

@FXML
private Label what;

private static Stage stage;

private static BorderPane borderPane;

@FXML
public void initialize(){
what.setText("Testing"); // this woks
cancelButton.setOnAction(e -> stage.close());
}

public void display() throws IOException {

stage = new Stage();
stage.setResizable(false);
stage.setTitle("Product search");
stage.initModality(Modality.APPLICATION_MODAL);
FXMLLoader loader = new FXMLLoader();
loader.setLocation(SearchController.class.getResource("Search.fxml"));
borderPane = loader.load();
Scene scene = new Scene(borderPane);
stage.setScene(scene);
//what.setText("Testing") and this doesn't work
stage.showAndWait();

}



}

有人能告诉我为什么可以在初始化方法上写文本吗(该方法在 borderPane = loader.load(); 行之后被调用...所以为什么不如果我尝试在那行之后写在标签上,它会起作用吗?)

提前致谢

最佳答案

FXMLLoader 创建在 FXML 根元素的 fx:controller 属性中指定的类的实例。然后,当 fx:id 属性与字段名称匹配时,它将 FXML 文件中定义的元素注入(inject)它创建 的 Controller 实例。然后它调用该实例的 initialize() 方法。

您可以使用 new SearchController() “手动”创建 Controller 实例。这与 FXMLLoader 创建的对象不同。所以现在当您加载 fxml 文件时,您有两个不同的 SearchController 实例。因此,如果您从 display() 方法调用 what.setText(...),您并不是在 FXMLLoader< 创建的 Controller 实例上调用它。因此,what 尚未在您调用 what.setText(...) 的实例中初始化,您会得到一个空指针异常。

由于 initialize()FXMLLoader 在它创建的实例上调用,当您调用 what.setText(...)initialize() 方法中,您在 FXMLLoader 创建的实例上调用它,因此该实例的 FXML 注入(inject)字段已被初始化。

关于JavaFX,标签空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36186907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com