获取对 FXML ImageView 的引用

Getting reference to FXML ImageView

我正在用 JavaFX 制作游戏,为此我有 5x9 的 ImageView 网格和一些标签。当我尝试获取对 label 的引用时,我成功了。但是,当我尝试获取对 ImageView 的引用时,我得到 nullPointerException。

这是 root 的声明方式:

FXMLLoader loaderTwo = new FXMLLoader(getClass().getResource("/game/levelTwo.fxml"));
Parent rootTwo = loaderTwo.load();
this.handlerTwo = loaderTwo.getController();

这是标签的 FXML 部分:

<Label fx:id="sunCountLabel" layoutX="121.0" layoutY="15.0" minHeight="72.2891845703125" prefHeight="88.0" prefWidth="203.0" text="Label">
  <font>                                                                                                                                  
    <Font name="Gabriola" size="60.0" />                                                                                                  
  </font>                                                                                                                                 
</Label> 

图像视图的 FXML 部分:

<ImageView fx:id="OneFive" fitHeight="180.0" fitWidth="180.0" layoutX="892.0" layoutY="102.0">
  <effect>                                                                                   
    <DropShadow height="1.0" radius="0.0" width="1.0" />                                     
  </effect>                                                                                  
  <image>                                                                                    
    <Image url="@../media/half.png" />                                                       
  </image>                                                                                   
</ImageView>        

这是我提到它们的地方:

this.root = this.map.getLevel(2).getRoot();
Label l = (Label)this.root.lookup("#sunCountLabel");
ImageView i = (ImageView)this.root.lookup("OneFive");
System.out.println(i==null);
l.setText("1999");

问题是 Label 工作正常但 Imageview 给出 nullPointerException
我不明白为什么?
此外,场景加载完美,图像地址等没有问题。

您正在使用的选择器是类型选择器,也就是说,只有当节点从 getTypeSelector method 返回 "OneFive" 时,它才会起作用。 ImageView 不会这样做。

您可能想使用 ID 选择器。这要求您在选择器字符串的开头插入一个 #

ImageView i = (ImageView)this.root.lookup("#OneFive");

我强烈建议将 ImageView 注入控制器中的字段并通过控制器访问 ImageView。另请注意,在某些情况下 lookup 不起作用。在 ScrollPane 中查找内容,例如在第一次布局通过之前不起作用,因为添加 content 的节点结构是在第一次布局通过期间创建的。