我正在尝试创建一个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节)。
资源:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句