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

时间:2015-06-03 16:32:17

标签: arrays loops for-loop methods

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

不幸的是,我在checkGuess方法中插入了我的数组数组,我得到错误'在封闭范围内定义的局部变量x必须是最终的或有效的最终'。我对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;       
    }
}

其他信息:

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

checkGuess(JButton guess){
}

2 个答案:

答案 0 :(得分:0)

ActionListener是一个内部匿名类,它在将数组数组传递给函数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传递给班级。

我相信“this”将引用类的父级,它应该是'columns [x] [y]。我可能错了。

答案 1 :(得分:0)

在Java中,匿名类中使用的变量必须是最终的(或者在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]);
        }
    });
}