![](/img/trans.png)
[英]Java - access to variable within inner class or assign a value to final variable
[英]access to variable within inner class in 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:
使用但未在内部类中声明的任何局部变量,形式参数或异常参数必须声明为
final
。使用但未在内部类中声明的任何局部变量必须在内部类的主体之前明确赋值(第16节) 。
资源:
如果您在访问i
遇到问题,请在内部类的范围之外创建另一个变量(例如在label[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]);
}
你也可以在你的程序中使用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
封闭方法的变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.