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

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

    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]);
    }

我以为我可以通过使用或代替内部方法的调用来克服这一点,但我无法弄清楚。thissuperlabel[i]

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

我敢肯定,答案一定是我没有想到的非常愚蠢的事情,或者也许我犯了一些小错误。

任何帮助将不胜感激


答案 1

必须从内部(和匿名)类访问局部变量。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 :

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

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


资源:


答案 2

如果您在访问时遇到问题,请在内部类的范围之外创建另一个变量(例如,在):ilabel[i].addMouseListener(...)

for(int i=1; i<label.length; i++) {
   label[i] = new JLabel("label " + i);

   final int localI = i;
   label[i].addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent me) {
         label[localI].setVisible(false);
      }
   });
   cpane.add(label[i]);
}