You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:12:23