我正在编写一个我正在编写的程序存在以下问题,并且我已经在互联网上搜索过,但我无法找到任何可以帮助我理解以下问题的内容
因此,在另一个类中,我编写了一个方法,只要单击搜索按钮就会执行此方法,并且方法如下所示:
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();
行之后被调用...所以如果我尝试写的话为什么它不起作用该行后的标签?)
提前谢谢
答案 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注入字段已初始化。