访问java中内部类中的变量

Osc*_*nez 17 java variables jlabel event-handling inner-classes

我正在尝试创建一个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]);
    }
Run Code Online (Sandbox Code Playgroud)

我认为我可以通过使用this或者super代替label[i]内部方法中的调用来克服这个问题,但我无法弄明白.

编译错误是:从内部类中访问局部变量i; 需要被宣布为最终的

我敢肯定答案肯定是我没想过的傻事,或者我犯了一些小错误.

任何帮助,将不胜感激

Col*_*ert 27

必须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;
}
Run Code Online (Sandbox Code Playgroud)

来自JLS:

必须声明使用但未在内部类中声明的任何局部变量,形式参数或异常参数final.

使用但未在内部类中声明的任何局部变量必须在内部类的主体之前明确赋值(第16节).


资源: