我有一个JToggleButtons阵列数组。他们正在构建一个正方形,当点击它们时,它们应该调用一个方法并将它们各自的坐标作为参数。我的第一次尝试看起来像这样:
int row = 0;
int col = 0;
for (final JToggleButton[] buttonRow : opponentFieldButtons) {
col = 0;
for (final JToggleButton button : buttonRow) {
JToggleButton newButton = new JToggleButton("O");
square.add(newButton);
newButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendCoor(row, col);
}
});
opponentbg.add(Button1);
col++;
}
col = 0;
row++;
}
现在我在调用方法sendCoor()
时得到以下错误:“在封闭范围中定义的局部变量必须是最终的或有效的最终”。
通常,您可以像这样初始化一个新的最终int:
public void actionPerformed(ActionEvent e) {
final int cRow = row;
final int cCol = col;
sendCoor(cRow, cCol);
}
因为我们在一个循环中,所以这些变量也会设置好几次,因此错误保持不变:cRow和cCol不是最终的。
我可以创建一个实现ActionListener的全新类,并创建该类的实例,而不是我现在使用的匿名类。 但是,有没有更好的方法来解决这个问题?
答案 0 :(得分:3)
我认为你只是略微夸大了语法。尝试在代码中稍微不同的位置初始化这些变量。
int row = 0;
int col = 0;
for (final JToggleButton[] buttonRow : opponentFieldButtons) {
col = 0;
for (final JToggleButton button : buttonRow) {
JToggleButton newButton = new JToggleButton("O");
square.add(newButton);
final int cRow = row;
final int cCol = col;
newButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendCoor(cRow, cCol);
}
});
opponentbg.add(Button1);
col++;
}
row++;
}
不在ActionListener
内,这是导致错误的原因。在ActionListener
的定义之外声明最终变量,以便在ActionListener
看到它们之前它们是最终的。
答案 1 :(得分:1)
row
和col
是本地变量标题。
此方法在“初始化时间”执行。当调用actionPerformed()
的匿名内部类实现的方法ActionListener
时,外部方法已经离开,并且两个变量不再存在。因此,变量本身不能在actionPerformed()
内使用,只能在当前值中使用。当局部变量是最终的时,Java支持它。
只要你不改变值Java(8) implicity 将它们视为 final 并允许你在匿名内部使用它们的值类