java - 在java中访问内部类中的变量

标签 java variables event-handling inner-classes jlabel

我正在尝试创建一个 JLabel 数组,所有这些在单击时都应该不可见。当试图通过需要访问用于声明标签的循环的迭代变量的内部类来设置鼠标监听器时,问题就来了。代码是不言自明的:

    for(int i=1; i<label.length; i++) {
       label[i] = new JLabel("label " + i);
       label[i].addMouseListener(new MouseAdapter() {
          public void mouseClicked(MouseEvent me) {
             label[i].setVisible(false);   // compilation error here
          }
       });
       cpane.add(label[i]);
    }

我认为我可以通过使用 this 或者 super 而不是调用 label[i] 来克服这个问题内部方法,但我一直无法弄清楚。

编译错误是:局部变量i是从内部类内部访问的;需要声明为final`

我确定答案一定是我没有想到的非常愚蠢的东西,或者我可能犯了一些小错误。

任何帮助将不胜感激

最佳答案

您的局部变量必须是 final 才能从内部(和匿名)类访问。

您可以像这样更改您的代码:

for (int i = 1; i < label.length; i++) {
    final JLabel currentLabel =new JLabel("label " + i); 
    currentLabel.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent me) {
            currentLabel.setVisible(false);   // No more compilation error here
        }
    });
    label[i] = currentLabel;
}

来自 JLS:

Any local variable, formal parameter, or exception parameter used but not declared in an inner class must be declared final.

Any local variable used but not declared in an inner class must be definitely assigned (§16) before the body of the inner class.


资源:

关于java - 在java中访问内部类中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3901597/

相关文章:

java - 将 Swing JDialog 设置为非模式

PHP 输出变量未出现

c# - 我有事件处理程序 (c#) 的问题

javascript - 我不想刷新我的页面或控制台! JavaScript 表单处理

java - Intellij 在 jar 文件中包含 src 文件

java - 如何在 5 分钟后关闭 HttpUrlConnection 而不会在 Java 中出现异常?

java - 如何从我的 java .jar 文件创建可执行的 apple .app 文件?

variables - 在没有索引的情况下遍历变量?

xcode - 如何从嵌套类swift更新类中的变量

c# - 如何取消订阅使用 lambda 表达式的事件?