通过for循环将方法应用于数组

Apply method to array through for loop

我正在尝试通过 for 循环将方法应用于数组数组。

不幸的是,当我在 checkGuess 方法中插入我的数组时,出现了错误 'Local variable x defined in an enclosing scope must be final or effectively final'。我是 Java 的新手,所以我不确定自己做错了什么...如有任何帮助,我们将不胜感激。

for(int x = 0; x < columns.length; x++){
columns[x][y].addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent event) {
        checkGuess(columns[x][y]);
    }
});

    if(x>4 && y<5){
        y++;
        x=-1;       
    }
}

附加信息:

数组的数组包含 JButton。 checkGuess() 方法将 JButton 作为参数,如下所示:

checkGuess(JButton guess){
}

ActionListener 是一个内部匿名的 class 并且在将数组数组传递给函数 checkGuess() 时尝试读取它时它不知道 'x' 是什么。

未经测试,但这可能有效:

for(int x = 0; x < columns.length; x++){
columns[x][y].addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent event) {
        checkGuess(this);
    }
});

    if(x>4 && y<5){
        y++;
        x=-1;       
    }
}

如果没有,您需要了解如何将 x 传递给 class。

我相信 "this" 将引用 class 的父项,它应该是 'columns[x][y]。不过我可能是错的。

在 Java 中,在匿名 class 中使用的变量必须是最终的(或者在 Java 8 中,实际上是最终的 - 本质上是一样的,只是没有显式 final修饰符)。至于为什么会这样,Jon Skeet 对此有一个很好的回答 here.

一种更正代码的方法是将 x 分配给最终引用,如下所示:

for (int x = 0; x < columns.length; x++) {
    final int copy = x;

    columns[x][y].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            checkGuess(columns[copy][y]);
        }
    });
}