获取每行中包含 HBoxes 的网格窗格的 X 和 Y 值

Getting X and Y values of a gridpane with HBoxes in every row

我在 JavaFX 中有一个脚本,我需要在其中获取 GridPane 的 X 和 Y 或 Row 和 Col 值。每个网格都有一个 HBox 并且 HBox 的大小总是变化的,因为每个 HBox 中有随机数量的形状。单击该特定网格时,我需要能够获得 HBox 中形状的值。我尝试将每一行和每列设置为事件处理程序,但这似乎不起作用。有没有比手动将每个 HBox 的宽度添加到光标左侧更简单的方法来获取每一行和每一列的值?

这是我当前的代码和输出。 (我添加了两张图片来展示我所说的每个 HBox 中随机形状的意思。)

示例图片 1:

示例图片 2:

提前致谢。

//Circle objects, add them inside the circleArrary
for(col = 0; col < NUM_COL; col++) {
    for(row = 0; row < NUM_ROW; row++) {
        cardNum = queue.peek().getNumber();
        p = queue.peek().getPattern();
        colr = queue.peek().getColor();
        sh = queue.peek().getShape();
        attr = new DetermineCardAttributes(colr, p, sh);
        cards[col][row] = new HBox();
        cards[col][row].setSpacing(10);
        cards[col][row].setPadding(new Insets(10, 10, 10, 10));

        for(int i = 0; i < cardNum; i++) {
            inner = new Circle(30);
            inner.setFill(Color.WHITE);
            inner2 = new Circle(20);
            inner2.setFill(attr.getColor(colr));
            inner3 = new Circle(10);
            inner3.setFill(Color.WHITE);
            if(sh.equalsIgnoreCase("circle")) {
                inner.setRadius(50);
                inner2.setRadius(40);
                inner3.setRadius(30);
            }
            shape2 = attr.getShape(sh);
            shape2.setStrokeWidth(width);
            shape2.setLayoutX(3);
            shape2.setLayoutY(3);
            shape2.setStroke(attr.getColor(colr));
            shape2.setFill(attr.getFill(p));
            stack = new StackPane();
            if(!p.equalsIgnoreCase("stripe")) {
                cards[col][row].getChildren().addAll(shape2);
                holderCards[col][row] = queue.peek();
            } else {
                stack.getChildren().addAll(shape2,inner,inner2,inner3);
                cards[col][row].getChildren().addAll(stack);
                holderCards[col][row] = queue.peek();
            }
            cards[col][row].setAlignment(Pos.CENTER);
            cards[col][row].setOnMouseDragged(new MouseHandler());
        }
        canvas.add(cards[col][row], col, row);
        queue.poll();
    }
}
 private class MouseHandler implements EventHandler<MouseEvent>
{
    public void handle(MouseEvent event)
    {
        System.out.println(event.getX());
        
    }
    
}

我想我一定是误解了这个问题。这不是您需要的吗?

private class MouseHandler implements EventHandler<MouseEvent> {

    private final int row ;
    private final int column ;

    MouseHandler(int column, int row) {
        this.row = row ;
        this.column = column ;
    }

    public void handle(MouseEvent event) {
        System.out.println("["+column+", "+row+"]");
    }
    
}

cards[col][row].setOnMouseDragged(new MouseHandler(col, row));

您可以对 lambda 表达式执行相同的操作;您只需要制作 final 个变量副本:

final int r = row ;
final int c = col ;
cards[col][row].setOnMouseDragged(event -> {
    System.out.println("["+c+", "+r+"]");
});