获取每行中包含 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+"]");
});
我在 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+"]");
});