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