gpt4 book ai didi

java - 尝试将 ActionListener 添加到 ButtonArray

转载 作者:行者123 更新时间:2023-12-01 12:46:42 26 4
gpt4 key购买 nike

我不太确定我的代码出了什么问题,但是在添加 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com