JavaFX,Label空指针异常

时间:2016-03-23 19:19:03

标签: javafx nullpointerexception label

我正在编写一个我正在编写的程序存在以下问题,并且我已经在互联网上搜索过,但我无法找到任何可以帮助我理解以下问题的内容

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

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();

    }



}

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

提前谢谢

1 个答案:

答案 0 :(得分:2)

int main(){ void** MyArray = malloc(500 * sizeof(void*)); printf("Last pointer is located at: %p\n", (void *)&(MyArray[499])); free(MyArray); return 0; } 创建FXML根元素的FXMLLoader属性中指定的类的实例。然后,当fx:controller属性与字段名称匹配时,它会将FXML文件中定义的元素注入到它创建的控制器实例 中。然后它调用该实例上的fx:id方法。

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

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