在JavaFX中访问GridPane的列索引和行索引时,始终返回null

在JavaFX中访问GridPane的列索引和行索引时,始终返回null,javafx,Javafx,大家好,我在网上尝试了许多解决方案,介绍了如何获取在Gridpane中单击的节点(单元格)。我使用的获取节点的方法如下所示。在使用此方法之前,我还尝试遍历所有节点。我已经用scenebuilder构建了gridpane,正如您在下面的图片中所看到的,列和行清晰地显示在那里。我正在尝试这个解决方案,但是正如我在上面提到的,从行和列返回的值是空的 @FXML private void mouseEntered(MouseEvent e) { Node source = (No

大家好,我在网上尝试了许多解决方案,介绍了如何获取在Gridpane中单击的节点(单元格)。我使用的获取节点的方法如下所示。在使用此方法之前,我还尝试遍历所有节点。我已经用scenebuilder构建了gridpane,正如您在下面的图片中所看到的,列和行清晰地显示在那里。我正在尝试这个解决方案,但是正如我在上面提到的,从行和列返回的值是空的

@FXML
    private void mouseEntered(MouseEvent e) {
        Node source = (Node)e.getSource() ;
        System.out.println(source);
        Integer colIndex = userSelectionGrid.getColumnIndex(source);
        Integer rowIndex = userSelectionGrid.getRowIndex(source);
        if (colIndex == null && rowIndex == null) System.out.println("BOO");
        else
        System.out.printf("Mouse entered cell [%d, %d]%n", colIndex.intValue(), rowIndex.intValue());
    }

包含此网格的FXML

<GridPane fx:id="userSelectionGrid" onMouseClicked="#mouseEntered" prefHeight="44.0" prefWidth="563.0">
         <columnConstraints>
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
         </columnConstraints>
         <rowConstraints>
            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
         </rowConstraints>
         <children>
            <Label text="SAVE" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="0">
               <font>
                  <Font name="System Bold" size="13.0" />
               </font>
            </Label>
            <Label text="CANCEL" GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.rowIndex="0">
               <font>
                  <Font name="System Bold" size="13.0" />
               </font>
            </Label>
            <Separator orientation="VERTICAL" GridPane.columnIndex="1" />
         </children>
         <VBox.margin>
            <Insets />
         </VBox.margin>
      </GridPane>

事件的源是添加处理程序的
节点,即在本例中是
网格窗格
。您可以将处理程序添加到
GridPane
的子级,以确保源
节点的正确性:



请注意,您也可以使用原始的fxml实现这一点。但是,您应该考虑以下几点:

  • null
    也是
    GridPane.getRowIndex
    GridPane.getColumnIndex
    的有效返回值。这并不意味着节点不是
    GridPane
    的子节点,只是意味着该值没有从默认值更改。这与使用值
    0
    的效果相同
  • 状况

    if (colIndex == null && rowIndex == null)
    
    太强,无法防止else部分中出现
    NullPointerException
    。例如,如果单击了
    分隔符
    ,可能会发生这种情况

  • 事件的目标是实际单击的节点,它可能是
    标签
    皮肤中的
    节点。您可以从此节点遍历到父节点,直到父节点是
    GridPane
    ,以找到
    GridPane
    的正确子节点

  • 请注意,
    标签
    s不会填充整个
    网格窗格
    ,除非您将首选大小设置为大于
    网格窗格
    约束。这会弄乱
    网格窗格的布局。解决方法是将
    区域
    s放置在单元格中
    标签
    s的后面。可以使用单元格调整这些节点的大小,而不会影响
    网格窗格
    布局,这样可以捕获这些节点上的事件:


    事件的源是添加处理程序的
    节点,即在本例中是
    网格窗格
    。您可以将处理程序添加到
    GridPane
    的子级,以确保源
    节点的正确性:

    
    

    请注意,您也可以使用原始的fxml实现这一点。但是,您应该考虑以下几点:

  • null
    也是
    GridPane.getRowIndex
    GridPane.getColumnIndex
    的有效返回值。这并不意味着节点不是
    GridPane
    的子节点,只是意味着该值没有从默认值更改。这与使用值
    0
    的效果相同
  • 状况

    if (colIndex == null && rowIndex == null)
    
    太强,无法防止else部分中出现
    NullPointerException
    。例如,如果单击了
    分隔符
    ,可能会发生这种情况

  • 事件的目标是实际单击的节点,它可能是
    标签
    皮肤中的
    节点。您可以从此节点遍历到父节点,直到父节点是
    GridPane
    ,以找到
    GridPane
    的正确子节点

  • 请注意,
    标签
    s不会填充整个
    网格窗格
    ,除非您将首选大小设置为大于
    网格窗格
    约束。这会弄乱
    网格窗格的布局。解决方法是将
    区域
    s放置在单元格中
    标签
    s的后面。可以使用单元格调整这些节点的大小,而不会影响
    网格窗格
    布局,这样可以捕获这些节点上的事件:

    
    
    您在何处添加了此处理程序(哪个
    节点
    )?很抱歉,我对此还很陌生,但我想您是在问我在scenebuilder中的何处添加了Mouseenterned方法。在网格的“代码”部分下,我在onMouseClicked方法中添加了它,您在其中添加了此处理程序(即
    节点
    )?很抱歉,我对此仍然很陌生,但我想您会问我在scenebuilder中的何处添加了Mouseenterned方法。在网格的代码部分下,我在onMouseClicked方法中添加了它。嗯,我似乎遗漏了一些东西。我试过你上面的姿势,我相信我理解背后的逻辑。然而,我现在得到的是,只有单个网格单元中的标签被识别。我希望实现的是,如果用户点击标签为a的单元格