提问人:TimNeutron 提问时间:3/24/2016 更新时间:3/24/2016 访问量:8704
JavaFX,标签空指针异常
JavaFX, Label null pointer exception
问:
我目前正在编写的程序中遇到了以下问题,并且我在互联网上搜索过,但是我找不到任何可以帮助我理解以下问题的东西
因此,在另一个类中,我编写了一个方法,每当单击搜索按钮时都会执行该方法,该方法如下所示:
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();
先谢谢你
答:
创建在 FXML 根元素的属性中指定的类的实例。然后,当属性与字段名称匹配时,它将 FXML 文件中定义的元素注入到它创建的控制器实例中。然后,它在该实例上调用该方法。FXMLLoader
fx:controller
fx:id
initialize()
您可以使用 “手动”创建控制器的实例。这与 创建的对象不同。因此,现在当您加载 fxml 文件时,您有两个不同的 .因此,如果从该方法调用,则不会在 创建的控制器实例上调用它。因此,尚未在您调用的实例中初始化,并且您收到空指针异常。new SearchController()
FXMLLoader
SearchController
what.setText(...)
display()
FXMLLoader
what
what.setText(...)
由于是由 在它创建的实例上调用的,因此当您从该方法调用时,您是在 创建的实例上调用它,因此该实例的 FXML 注入字段已初始化。initialize()
FXMLLoader
what.setText(...)
initialize()
FXMLLoader
有关此问题的其他信息,请参阅以下答复:
评论
FXMLLoader
display()
SearchController a = loader.getController()
loader.getController()
load()
评论
static
cancelButton.setOnAction(e -> cancelButton.getScene().getWindow().hide());
stage
borderPane
static
fx:id="borderPane"