JavaFX,标签空指针异常

问题描述 投票:0回答:1

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

因此,在另一个类中,我编写了一个方法,每当单击搜索按钮时都会执行此方法,该方法如下所示:

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();
行之后被调用......那么如果我尝试在该行之后的标签上写入,为什么它不起作用? )

提前谢谢您

javafx nullpointerexception label
1个回答
6
投票

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

您可以使用

new SearchController()

“手动”创建控制器的实例。这与 
FXMLLoader
 创建的对象不同。现在,当您加载 fxml 文件时,您将拥有两个不同的 
SearchController
 实例。因此,如果您从 
what.setText(...)
 方法调用 
display()
,则不会在 
FXMLLoader
 创建的控制器实例上调用它。因此,在您调用 
what
 的实例中,
what.setText(...)
 尚未初始化,并且会出现空指针异常。

由于

initialize()

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

有关此问题的其他信息在以下问题的答案中提供:

  • 切勿在 FXML 文件中指定的控制器上调用 new
© www.soinside.com 2019 - 2024. All rights reserved.