访问java中内部类中的变量
我正在尝试创建一个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
才能从内部(和匿名)类访问。
您可以更改以下内容的代码:
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:
使用但未在内部类中声明的任何局部变量,forms参数或exception参数必须声明为
final
。必须在内部类的主体之前明确赋值(§16)使用但未在内部类中声明的任何局部变量。
资源:
- JLS - 内部类和封闭实例
如果您在访问i
遇到问题,请在内部类的范围之外创建另一个变量(例如在label[i].addMouseListener(...)
):
for(int i=1; i
你也可以在你的程序中使用getSource
。 在此之后,您可以在typecasting
的帮助下访问您的组件。 它将减少额外的代码行,您的代码将如下所示
for (int i = 1; i < label.length; i++) { currentLabel.addMouseListener(new MouseAdapter(e) { public void mouseClicked(MouseEvent me) { JLabel label = (JLabel) me.getSource(); } }); }
发生这种情况是因为label
未指定为final
。
将标签数组声明为:
final JLabel[] label;
代替:
JLabel[] label;
您的MouseAdapter
不是内部类; 这是一个匿名课程。 匿名类只能引用其封闭代码的final
变量。
匿名内部类只能访问final
封闭方法的变量。