我不太确定我的代码出了什么问题,但是在添加 ActionListener 的过程中,我收到错误:“从内部类引用的局部变量必须是最终的或实际上是最终的。”感谢您的帮助:)。
for (int i = 0; i < 30; i++) {
button[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == button[i]) {
if (game.panel[i] instanceof Treasure || game.panel[i] instanceof Mine) {
game.incScore(game.referTile(i));
if (game.panel[i] instanceof Treasure) {
treasurelocated++;
//Output onto jta
if (treasurelocated == 4) {
GEnd();
}
} else {
//Output onto jta found mine
}
} else {
//Output onto jta found nothing
game.blank();
}
changeS();
button[i].setEnabled(false);
}
}
});
}
最佳答案
就在new ActionLister() {
之后,您开始定义一个匿名内部类。它是一个实现 ActionListener
接口(interface)的“无名”类。下面的代码包含在该内部类的上下文中,并且必须遵循特殊规则。
Java 语言规范要求
local variables referenced from an inner class must be final or effectively final.
final 变量是用final
关键字标记的变量。这样的变量只能被赋值一次,它实际上是一个常量。
有效最终变量就是这样一个变量,其中添加final
关键字不会导致编译器提示。换句话说,它实际上是最终的,但只是没有用正确的关键字标记。
现在回到您的代码。代码中的一个或多个变量是来自包含代码的方法的局部变量,该变量既不是最终的也不是有效最终的。
特别地,你的变量i
肯定是其中之一。您不应该从监听器的代码中引用 button[i]
。事实上,你不需要它!确保始终仅在事件发生的按钮上调用监听器。如果您需要对 game.panel[i]
的引用,请以某种方式将其放在您的按钮上(例如作为引用)。
有关更多说明,请在此处阅读我的答案:https://stackoverflow.com/a/24170806/2886891 。从那里您可以了解有关监听器代码的上下文的更多信息。请记住:监听器代码是在与定义它的上下文完全不同的上下文中调用的,因此 i
变量没有您期望的含义。
关于java - 尝试将 ActionListener 添加到 ButtonArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24636869/