我正在使用JavaFX8中的简单棋盘游戏实现。
对于游戏板,我的决定是使用10x10 GridPane并使用矩形填充其格式化的初始化方法。
private void drawBoard() {
gridpaneBoard.getChildren().clear();
for (int y = 0; y < gridpaneBoard.getRowConstraints().size(); y++)
for (int x = 0; x < gridpaneBoard.getColumnConstraints().size(); x++) {
Rectangle rect = new Rectangle(55,55);
rect.setStroke(Color.BLACK);
Tile tile = GameController.getInstance().getBoard().getTile(x, y);
if (tile.hasBranch())
rect.setFill(QuestionDifficulty.values()[tile.getBranch()
.getQuestion().getQuestion()
.getLevel()].getColor());
else
rect.setFill(Color.WHITE);
gridpaneBoard.add(rect, x, y);
gridpaneBoard.add(new Label(String.valueOf(tile.getNumber())), x, y);
}
}
为了在骰子滚动后动画玩家令牌动作,我想我需要知道中心x&amp;每个图块的中心y(用于创建从源图块到目标图块的路径转换)。
我已经尝试过给别人提问的各种答案,但是对我来说一切都是0,0。
这是此场景中的容器层次结构:
这就是输出目前的情况:
如果GridPane适用于我想要实现的目标,我怎样才能让孩子(在这种情况下是一个矩形&#39; s)屏幕/场景中心x,y?
如果GridPane不合适,你能否指出我的替代品以及如何实现我想要的......
谢谢!
答案 0 :(得分:2)
您只需致电getBoundsInParent
即可获取其中父级Node
的尺寸。
下面的例子有点简化,但它应该展示这种方法:
@Override
public void start(Stage primaryStage) {
GridPane gridpaneBoard = new GridPane();
for (int y = 0; y < 10; y++) {
for (int x = 0; x < 10; x++) {
Rectangle rect = new Rectangle(55, 55);
rect.setStroke(Color.BLACK);
rect.setFill((x + y) % 2 == 0 ? Color.WHITE : Color.DARKGRAY);
gridpaneBoard.add(rect, x, y);
}
}
gridpaneBoard.setOnMouseClicked(evt -> {
Node target = evt.getPickResult().getIntersectedNode();
if (target != gridpaneBoard) {
// in your case you'd need to make sure this is not the Label
Bounds bounds = target.getBoundsInParent();
System.out.println("bounds = " +bounds);
System.out.println("centerX = " +(bounds.getMinX() + bounds.getWidth()/2));
System.out.println("centerY = " +(bounds.getMinY() + bounds.getHeight()/2));
}
});
Scene scene = new Scene(gridpaneBoard);
primaryStage.setScene(scene);
primaryStage.show();
}
如果需要与GridPane
坐标不同的坐标,则可以将getBoundsInLocal
与localTo...
结合使用:
Bounds bounds = target.localToScene(target.getBoundsInLocal());
用于场景边界或
Bounds bounds = target.localToScreen(target.getBoundsInLocal());
用于屏幕边界。
注意:这可以独立于修改GridPane
如何布置其子项的任何属性。
答案 1 :(得分:1)
您可以使用:
- GridPane.getColumnIndex(Node)
获取列索引。
- GridPane.getRowIndex(Node)
获取行索引。
- 由于您了解了您孩子的Width
和Height
(55,55)(矩形),您只需计算其centerX
,{ {1}}这与它在容器中的位置有关,但由于你使用的是GridPane我不认为它是可能的,因为这个有约束。您可以通过更改对象的容器或在另一个原始/列中完全重绘它来修复它,这是一个示例Replace a node at (row,col)。