Java FXML GridPane.getRowIndex(源代码)在场景构建器中处理鼠标事件时始终返回null

dxxyhpgq  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(355)

我是Java FXML的新手。我还在学习如何使用Scene Builder 2.0和控制器类。我不明白为什么这会返回null

@FXML
public void gridClick(MouseEvent e){
    Node source = (Node)e.getSource() ;
    Integer colIndex = grid.getColumnIndex(source);
    Integer rowIndex = grid.getRowIndex(source);
    System.out.println("Mouse entered cell ["+colIndex+","+rowIndex+"]");
}

我在SceneBuilder The gridpane has been created in SceneBuilder中初始化了所有网格单元格,然后在控制器类初始化中为每个单元格创建了锚窗格:

for(int row=0;row<numRows;row++){
    for(int col=0;col<numCols;col++){
        AnchorPane slot=new AnchorPane();
        slot.setStyle("-fx-border-color: black;-fx-border-width: 0.2;");
        grid.add(slot,col,row);
    }
}

我不知道这是不是一个糟糕的方法,但我正在努力学习。请帮助我如何做不同的,或者为什么它给我空值。当用户点击一个网格单元格,即他们应该是锚定窗格,我想要他们点击的锚定窗格或网格单元格行和列。

vyu0f0g1

vyu0f0g11#

我不知道这是否是一个问题了,但寻找答案我遇到了这个主题,所以我会回答它,如果有人需要答案。首先,问题是与访问节点本身的命令:命令getColumnIndex是静态的,所以你必须直接访问类型:GridPane.getColumnIndex(source);
其次,您尝试检索网格窗格中没有任何内容的网格窗格的坐标,但这不起作用,因为网格窗格中没有子项的单元格(表示节点类型)为null。网格窗格交叉点中必须有一个节点,比如ImageView,这意味着所有节点都必须转换为ImageView类型节点:
for(Node i : grid.getChildren){ImageView iv = (ImageView)i;
现在您可以检索索引:
int colIndex = GridPane.getColumnIndex(iv);}
基本上,这意味着该方法必须知道它正在检索的索引所属的节点的类型。
最后,要小心使用fxml,因为,例如,如果您将ImageView或按钮拖放到SceneBuilder中的网格窗格,如果网格窗格单元格的行或列索引为0,fxml将采用默认值,即0,并且不会显式赋值:

<example>
<ImageView fx:id="IvTarget_0_0" fitHeight="55.0" fitWidth="58.0" onDragDropped="#handleImageDrop" pickOnBounds="true" preserveRatio="true">
               <GridPane.margin>
                  <Insets left="12.0" />
               </GridPane.margin>
            </ImageView>
</example>

因此,您可以看到fxml编辑器中坐标为0,0的节点没有设置GridPane.columnIndexGridPane.rowIndex值。对于其他功能,这是可以的,但当检索索引时,它将抛出nullPtr异常,即使多个子节点中只有一个没有设置这些属性。在这种情况下,您必须在fxml编辑器中查看所有节点,并手动设置它们。

<example>
<ImageView fx:id="IvTarget_0_0" GridPane.columnIndex="0" GridPane.rowIndex="0" fitHeight="55.0" fitWidth="58.0" onDragDropped="#handleImageDrop" pickOnBounds="true" preserveRatio="true">
               <GridPane.margin>
                  <Insets left="12.0" />
               </GridPane.margin>
            </ImageView>
</example>

希望这有帮助!

相关问题