java - 尝试将 ActionListener 添加到 ButtonArray

标签 java actionlistener inner-classes final anonymous-inner-class

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

相关文章:

java - Jni4net,如何定义在 Java 中使用的 C# 事件

java - 将新的 JButton 添加到已有的二维 JButton 数组中

java - 如何通过单击按钮重新绘制 jpanel 并在 2 个面板之间切换

java - 编译器正在创建带有 $ 的额外类文件

java - 在 Java 中使用大型内部类不好吗?

java - 是否有任何设计模式只允许特定类新建其他特定类

java - 为什么我不能将 List<X<Long>> 作为 List<X<?>> 的参数

java - 为 Jbutton 设置 ActionListener "class"

java applet 无法打印 actionPerformed 中的值

java - 如何正确关闭与 mysql 服务器的 hibernate session