Java 获取对FXML ImageView的引用

Java 获取对FXML ImageView的引用,java,javafx-8,Java,Javafx 8,我正在用JavaFX制作一个游戏,我有5x9的ImageView网格和一些标签。当我尝试获取标签的引用时,我成功了。然而,当我试图获取对ImageView的引用时,我得到了nullPointerException 下面是如何声明root: FXMLLoader loaderTwo = new FXMLLoader(getClass().getResource("/game/levelTwo.fxml")); Parent rootTwo = loaderTwo.load(); this.hand

我正在用JavaFX制作一个游戏,我有5x9的ImageView网格和一些标签。当我尝试获取标签的引用时,我成功了。然而,当我试图获取对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> 
问题在于标签工作正常,但Imageview提供了nullPointerException
我不明白为什么?

此外,场景加载完美,没有图像地址等问题。

您使用的选择器是类型选择器,即它只能工作,如果某个节点从返回了“OneFive”<代码>图像视图不执行此操作

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

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

我强烈建议将
ImageView
注入控制器中的一个字段,并通过控制器访问
ImageView
。还要注意的是,在某些情况下,
查找
不起作用。在
滚动窗格
中查找内容,例如,在第一次布局过程之前不起作用,因为添加
内容
的节点结构是在第一次布局过程中创建的。

问题已解决,非常感谢。只是一条建议:我有45个瓷砖和15个以上的图像视图(使用它们作为按钮)。另外,我正在使用锚窗格。在这种情况下,注入真的会有所帮助,因为对象数量巨大。我的方式也很好。@AdityaSinghRathore对于这么多的平铺/图像视图,如果可能的话,我建议通过控制器中的循环创建它们,而不是单独在FXML中声明每个视图。然后使用一些数据结构(例如列表、地图等)来存储对这些平铺/图像视图的引用。@adityasinghratore Imho fxml也应被视为代码。样板代码是个坏主意,而您的fxml似乎包含了很多样板代码。考虑使用java代码设置场景的这一部分。例如,在
initialize
方法中使用循环可以大幅减小fxml的大小,允许您通过修改代码的单个部分(在循环中创建分幅的部分)来更新所有分幅,还允许您以适合您需要的方式存储节点,例如,在数组、列表、映射中,如果我没有记错的话(我可能没有记错),在过去,为了使用
id
选择器,仅仅在FXML中定义
fx:id
是不够的,我还需要一个
id
属性,例如
。也许我没有正确地回忆起,或者也许FXML加载器实现在更高版本中更改为也设置了与fx:id匹配的css id。我记得的唯一一件事是,使用这两个属性,您可以将节点注入到一个名称与css id不同的字段中。。。
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");
ImageView i = (ImageView)this.root.lookup("#OneFive");