JavaFX实现点击矩形数组元素时获取其索引的方法
获取战舰游戏战场方块的点击索引解决方案
嘿,这问题其实很好解决——我们只需要在创建每个Rectangle的时候,给它绑定鼠标点击事件,同时把它对应的数组索引(也就是循环里的i和j)传递到事件处理逻辑里就行。
修改后的CreateField方法示例
下面是给你原代码添加点击事件处理后的完整版本:
private Rectangle[][] field; public VBox CreateField(){ VBox vbox = new VBox(2); for(int i = 0; i < this.columns; ++i){ HBox hbox = new HBox(2); // 把循环变量i转成有效final变量,避免lambda捕获错误 final int columnIndex = i; 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); // 同样处理循环变量j final int rowIndex = j; // 添加鼠标点击事件逻辑 this.field[i][j].setOnMouseClicked(event -> { // 这里直接拿到当前方块在field数组中的索引 System.out.println("点击了field[" + columnIndex + "][" + rowIndex + "]"); // 你可以在这里扩展业务逻辑,比如标记点击状态 Rectangle clickedRect = (Rectangle) event.getSource(); clickedRect.setFill(Color.RED); // 用红色标记已点击的方块 }); hbox.getChildren().add(this.field[i][j]); } vbox.getChildren().add(hbox); } return vbox; }
关键细节说明
- 为什么要定义
columnIndex和rowIndex?
Java的lambda表达式要求捕获的变量是「有效final」的(赋值后不再修改)。如果直接用循环里的i和j,lambda会捕获到变量的引用,最终所有事件都会拿到循环结束时的i/j值,而不是每个方块对应的索引。把当前循环值赋值给新的final变量,就能确保每个方块的事件逻辑拿到自己对应的正确索引。 - 直接获取点击的方块实例:通过
event.getSource()可以拿到被点击的Rectangle对象,方便你后续修改样式、判断是否击中战舰等操作。
这样修改后,用户点击任何一个战场方块时,你就能准确获取到它在field数组中的索引了。
内容的提问来源于stack exchange,提问作者JMAD2016
相关产品推荐
相关产品推荐

