当前位置: 首页 > 知识库问答 >
问题:

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

姚浩歌
2023-03-14

你好,所以我尝试了许多在线解决方案,如何获得在网格窗格中点击的节点(单元格)。我使用的获取节点的方法如下所示。我也尝试过迭代这个方法之前的所有节点。我已经用场景构建器构建了网格,正如你在下面的图片中看到的,列和行都清楚地存在。我正在尝试这个解决方案如何在鼠标上获得网格窗格行和列ID在JavaFX网格的每个单元格中输入?但是,正如我上面提到的,从行和列返回的值是null。

@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>

共有1个答案

申高卓
2023-03-14

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

<GridPane fx:id="userSelectionGrid" 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"  onMouseClicked="#mouseEntered">
           <font>
              <Font name="System Bold" size="13.0" />
           </font>
        </Label>
        <Label text="CANCEL" GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.rowIndex="0"  onMouseClicked="#mouseEntered">
           <font>
              <Font name="System Bold" size="13.0" />
           </font>
        </Label>
        <Separator orientation="VERTICAL" GridPane.columnIndex="1" />
     </children>
     <VBox.margin>
        <Insets />
     </VBox.margin>
</GridPane>

请注意,您也可以使用原始的fxml进行此工作。然而,有几件事你应该考虑:

>

if (colIndex == null && rowIndex == null)

过于强大,无法阻止其他部分中的NullPointerExc农田。这可能发生,例如,如果分隔符被单击。

@FXML
private void mouseEntered(MouseEvent e) {
    Node target = (Node) e.getTarget();
    // traverse towards root until userSelectionGrid is the parent node
    if (target != userSelectionGrid) {
        Node parent;
        while ((parent = target.getParent()) != userSelectionGrid) {
            target = parent;
        }
    }
    Integer colIndex = userSelectionGrid.getColumnIndex(target);
    Integer rowIndex = userSelectionGrid.getRowIndex(target);
    if (colIndex == null || rowIndex == null) {
        System.out.println("BOO");
    } else {
        System.out.printf("Mouse entered cell [%d, %d]%n", colIndex.intValue(), rowIndex.intValue());
    }
}

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

<GridPane fx:id="userSelectionGrid" prefHeight="44.0" prefWidth="563.0" onMouseClicked="#mouseEntered">                 
    <columnConstraints>
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" fillWidth="true" />
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" fillWidth="true" />
    </columnConstraints>
    <rowConstraints>
        <RowConstraints minHeight="10.0" vgrow="SOMETIMES" fillHeight="true" />
    </rowConstraints>
    <children>
        <Region GridPane.columnIndex="1" GridPane.rowIndex="0"/>
        <Region GridPane.columnIndex="0" GridPane.rowIndex="0"/>
        <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>

 类似资料:
  • 如何在JavaFX的网格窗格中获取列索引和行索引。请参见下面的代码 当鼠标在text1上输入时,我想获取GridPane的列索引和行索引 请让我知道。

  • 当我单击时,我尝试获取gridpane的行/列索引。 我在JTable(java swing)中寻找像getSelectedColumn()这样的方法 我搜索了这个。gridPane.getRowIndex(节点) 但这对我没有帮助。因为它需要节点名来获取行/列索引。 我通过语法制作了一个网格组件。所以节点名称是相同的。如何获取值?我的部分代码在下面。

  • 问题内容: 可以说我有一个MultiIndex系列: 我想应用一个使用行索引的函数: 我该怎么做?进行此类操作的推荐方法是什么?我希望获得一个新的Series,并将此函数所产生的值应用于每行并具有相同的MultiIndex。 问题答案: 我认为无法访问该索引;它将每行视为一个numpy对象,而不是一个Series,如您所见: 要解决此限制,请将索引提升为列,应用函数,然后使用原始索引重新创建Ser

  • 本文向大家介绍MySQL索引使用说明(单列索引和多列索引),包括了MySQL索引使用说明(单列索引和多列索引)的使用技巧和注意事项,需要的朋友参考一下 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列。请看下面这个查询: 这个查询与前面的查询略有不同,但仍属于简单查询。由于age是

  • 本文向大家介绍在SAP中查找行和列的索引,包括了在SAP中查找行和列的索引的使用技巧和注意事项,需要的朋友参考一下 要标识行的索引,可以使用属性“ indexOfRow”来获取单击按钮的行。 所有按钮都将在同一列中,因此获取列索引没有意义,但是如果您仍然需要获取列索引,则可以继续使用属性“ indexOfColumn”或“ columnIndex”。

  • 问题内容: 对于这个有争议的问题,我无法得到明确的答案。 MSDN文档中提到 聚类 聚集索引根据它们的键值对数据行进行 排序 并将其存储在表或视图中。这些是索引定义中包括的列。只能有一个每个表的聚集索引,因为数据行本身可以 进行排序 在只有一个订单。 表中的数据行唯一 按排序 顺序存储的时间是表包含聚簇索引时。当表具有聚簇索引时,该表称为聚簇表。如果表没有聚集索引,则其数据行将存储在称为堆的无序结