获取列/行索引时发生JavaFX错误

获取列/行索引时发生JavaFX错误,java,javafx,scenebuilder,Java,Javafx,Scenebuilder,我在JavaFX中遇到了一个奇怪的行为。 简言之: 我有一个网格窗格,并添加了一个元素来定位,比如说(0、0.或任何东西,只要行是0或列是0),那么.fxml文件不会填充row/column属性,并将其保留为空,默认为0。但如果我不这样做,而是希望实现例如listener,它使用GridPane.getColumnIndex(节点)获取单击元素的位置;然后它抛出一个异常,使其工作的唯一方法是手动编辑.fxml文件并添加那些column=0/row=0 这是虫子吗?故意的行为?这不是错误。请注意

我在JavaFX中遇到了一个奇怪的行为。 简言之:

我有一个网格窗格,并添加了一个元素来定位,比如说(0、0.或任何东西,只要行是0或列是0),那么.fxml文件不会填充row/column属性,并将其保留为空,默认为0。但如果我不这样做,而是希望实现例如listener,它使用GridPane.getColumnIndex(节点)获取单击元素的位置;然后它抛出一个异常,使其工作的唯一方法是手动编辑.fxml文件并添加那些column=0/row=0


这是虫子吗?故意的行为?

这不是错误。请注意

返回子级的行索引约束(如果已设置)

返回

子级的行索引,如果未设置行索引,则为null

因此,如果未设置它们,则返回的值不是布局中使用的默认值,而是
null

如果不在
节点上设置
GridPane.columnIndex
GridPane.rowIndex
约束,并将其添加到
GridPane
的子节点列表中,则将使用默认值:即这些属性的默认值为0。(其他值也有默认值,例如,如果未设置
列span
,则默认值为
1
。这意味着可以使用默认值,而无需增加节点的内存消耗。)

布局约束对放置在单元格中的节点的作用方式是使用一些特定键将值添加到
节点的属性中。(Node.getProperties()
方法只返回一个可以包含任意键值映射的
映射

    GridPane root = new GridPane();
    for (int x = 0 ; x < 8; x++) {
        for (int y = 0 ; y < 8 ; y++) {
            Label label = new Label(String.format("Cell [%d, %d]", x, y));
            root.getChildren().add(label);
            GridPane.setColumnIndex(label, x);
            GridPane.setRowIndex(label, y);
        }
    }
该方法已经实现(我假设,我还没有检查源代码),因此它与调用

Integer x = (Integer)node.getProperties().get("gridpane-column");
如果未设置列索引,则属性映射中没有此类映射,因此在本例中,
x
null

如果你这样做

int x = GridPane.getColumnIndex(node);
并且没有设置列索引,那么(因为您隐式地将返回的
Integer
解包为
int
),您实际上是在调用

int x = ((Integer)node.getProperties().get("gridpane-column")).intValue();

在这里,如果尚未设置列索引,
node.getProperties().get(…)
返回
null
(也由
GridPane.getColumnIndex(…)
文档指定),因此隐式调用
intValue()时会得到
NullPointerException

Scenebuilder喜欢将0视为未设置,并将约束字段置空。因此,如果在fxml文件中添加了约束,请在其中手动设置约束。例如。
int x = GridPane.getColumnIndex(node);
int x = ((Integer)node.getProperties().get("gridpane-column")).intValue();