如何获取GridPane不同行列单元格的中心X/Y坐标?点击返回值异常求助
解决棋盘格子点击后中心坐标始终为25.0的问题
可能的原因及解决步骤
1. 确认点击的目标节点是否为真正的格子
你当前获取的target可能不是棋盘的格子节点,而是格子内部的子元素(比如每个格子里的填充矩形、文本等)。如果这些子元素的尺寸是固定的50x50,那么它们的boundsInParent相对于格子的左上角都是(0,0,50,50),计算出的中心自然是25.0。
解决方法:
- 先打印目标节点的信息,验证是否为预期的格子:
gameBoard.setOnMouseClicked(evt -> { Node target = evt.getPickResult().getIntersectedNode(); System.out.println("点击的节点:" + target.getClass().getSimpleName() + " ID: " + target.getId()); // 后续代码... }); - 如果确实是子元素,向上遍历父节点找到真正的格子:
gameBoard.setOnMouseClicked(evt -> { Node target = evt.getPickResult().getIntersectedNode(); // 替换为你的格子节点类型(比如Pane、Rectangle等) Node gridCell = target; while (gridCell != gameBoard && !(gridCell instanceof Pane)) { gridCell = gridCell.getParent(); } if (gridCell != gameBoard) { Bounds bounds = gridCell.getBoundsInParent(); double centerX = bounds.getMinX() + bounds.getWidth() / 2; double centerY = bounds.getMinY() + bounds.getHeight() / 2; System.out.println("centerX = " + centerX); System.out.println("centerY = " + centerY); } });
2. 检查格子的布局是否正确
如果你的gameBoard是GridPane这类布局容器,格子节点可能没有被正确设置布局约束,导致所有格子的位置都重叠在左上角,boundsInParent完全一致。
解决方法:
- 确保添加格子时设置了正确的行列约束:
// 示例:向GridPane添加格子 int rows = 5; int cols = 5; double cellSize = 100; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { Pane cell = new Pane(); cell.setPrefSize(cellSize, cellSize); // 设置行列索引 GridPane.setRowIndex(cell, row); GridPane.setColumnIndex(cell, col); gameBoard.getChildren().add(cell); } } - 打印格子的
layoutX和layoutY,验证位置是否正确:System.out.println("格子布局X:" + gridCell.getLayoutX()); System.out.println("格子布局Y:" + gridCell.getLayoutY());
3. 改用更直接的坐标计算方式
如果不想依赖节点的bounds,可以直接通过鼠标事件的坐标转换到棋盘坐标系,再根据网格行列计算中心:
gameBoard.setOnMouseClicked(evt -> { // 将鼠标场景坐标转换为棋盘本地坐标 Point2D localCoords = gameBoard.sceneToLocal(evt.getSceneX(), evt.getSceneY()); double cellSize = 100; // 你的格子尺寸 // 计算点击的行列 int col = (int) (localCoords.getX() / cellSize); int row = (int) (localCoords.getY() / cellSize); // 计算格子中心坐标 double centerX = col * cellSize + cellSize / 2; double centerY = row * cellSize + cellSize / 2; System.out.println("centerX = " + centerX); System.out.println("centerY = " + centerY); });
内容的提问来源于stack exchange,提问作者Ryan Cruz
相关产品推荐
相关产品推荐

