如何在GridPane中获取Rectangle的屏幕/场景中心x,y?

时间:2016-12-02 10:42:18

标签: javafx-8 coordinates rectangles gridpane

我正在使用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。

这是此场景中的容器层次结构:

container hierarchy

这就是输出目前的情况:

enter image description here

如果GridPane适用于我想要实现的目标,我怎样才能让孩子(在这种情况下是一个矩形&#39; s)屏幕/场景中心x,y?

如果GridPane不合适,你能否指出我的替代品以及如何实现我想要的......

谢谢!

2 个答案:

答案 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坐标不同的坐标,则可以将getBoundsInLocallocalTo...结合使用:

Bounds bounds = target.localToScene(target.getBoundsInLocal());

用于场景边界或

Bounds bounds = target.localToScreen(target.getBoundsInLocal());

用于屏幕边界。

注意:这可以独立于修改GridPane如何布置其子项的任何属性。

答案 1 :(得分:1)

您可以使用:

- GridPane.getColumnIndex(Node)获取列索引。

- GridPane.getRowIndex(Node)获取行索引。

- 由于您了解了您孩子的WidthHeight(55,55)(矩形),您只需计算其centerX,{ {1}}这与它在容器中的位置有关,但由于你使用的是GridPane我不认为它是可能的,因为这个有约束。您可以通过更改对象的容器或在另一个原始/列中完全重绘它来修复它,这是一个示例Replace a node at (row,col)