我是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);
}
}
我不知道这是不是一个糟糕的方法,但我正在努力学习。请帮助我如何做不同的,或者为什么它给我空值。当用户点击一个网格单元格,即他们应该是锚定窗格,我想要他们点击的锚定窗格或网格单元格行和列。
1条答案
按热度按时间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,并且不会显式赋值:
因此,您可以看到fxml编辑器中坐标为0,0的节点没有设置
GridPane.columnIndex
或GridPane.rowIndex
值。对于其他功能,这是可以的,但当检索索引时,它将抛出nullPtr异常,即使多个子节点中只有一个没有设置这些属性。在这种情况下,您必须在fxml编辑器中查看所有节点,并手动设置它们。希望这有帮助!