我正在尝试构建战舰应用程序。到目前为止,我设法同时显示了玩家和敌人的两个字段。一个字段由一个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;
    }


结果如下:

java - 单击时Java-FX接收Shape-Array的索引-LMLPHP

当用户单击其中一个时,我需要接收一个矩形的索引。

你们能给我一个例子/代码如何完成我的问题吗?

最佳答案

我建议使用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/

10-11 07:55