我正在尝试构建战舰应用程序。到目前为止,我设法同时显示了玩家和敌人的两个字段。一个字段由一个VBox中的10 x 10个矩形-10个HBox组成。这是创建字段的方法:
private Rectangle[][] field;
public VBox CreateField(){
VBox vbox = new VBox(2);
for(int i = 0; i < this.columns; ++i){
HBox hbox = new HBox(2);
for(int j = 0; j < this.rows; ++j){
this.array[j][i] = 0;
this.field[i][j] = new Rectangle(this.height*j, this.width*i, this.height, this.width);
this.field[i][j].setStroke(Color.BLACK);
this.field[i][j].setFill(Color.LIGHTGRAY);
hbox.getChildren().add(this.field[i][j]);
}
vbox.getChildren().add(hbox);
}
return vbox;
}
结果如下:
当用户单击其中一个时,我需要接收一个矩形的索引。
你们能给我一个例子/代码如何完成我的问题吗?
最佳答案
我建议使用GridPane
而不是HBox
es和VBox
。您可以将循环索引复制到final
局部变量,以从在循环体内创建的匿名EventHandler
类/ lambda表达式访问它们,也可以在GridPane.getRowIndex
子代上使用GridPane.getColumnIndex
/ GridPane
:
public GridPane CreateField(){
GridPane grid = new GridPane();
grid.setVgap(2);
grid.setHgap(2);
EventHandler<MouseEvent> handler = evt -> {
Node source = (Node) evt.getSource();
int row = GridPane.getRowIndex(source);
int column = GridPane.getColumnIndex(source);
...
};
for(int i = 0; i < this.columns; i++){
for(int j = 0; j < this.rows; j++){
Rectangle rect = new Rectangle(this.height*j, this.width*i, this.height, this.width);
this.array[j][i] = 0;
this.field[i][j] = rect;
rect.setStroke(Color.BLACK);
rect.setFill(Color.LIGHTGRAY);
rect.setOnMouseClicked(handler);
grid.add(rect, j, i);
}
}
return grid;
}
您也可以使用
final int finalI = i;
final int finalJ = j;
rect.setOnMouseClicked(evt -> {
// TODO: use finalI and finalJ here
});
在内部循环中。
关于java - 单击时Java-FX接收Shape-Array的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50556296/