I'm trying to create an array of JLabels, all of them should go invisible when clicked. The problem comes when trying to set up the mouse listener through an inner class that needs access to the iteration variable of the loop used to declare the labels. Code is self-explanatory:
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]);
}
I thought that I could overcome this by the use of this
or maybe super
instead of the call of label[i]
within the inner method but I haven't been able to figure it out.
The compilation error is: local variable i is accessed from within inner class; needs to be declared final`
I'm sure that the answer must be something really silly I haven't thought of or maybe I'm making some small mistake.
Any help would be appreciated
Your local variable must be final
to be accessed from the inner (and anonymous) class.
You can change your code for something like this :
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;
}
From the JLS :
Any local variable, formal parameter, or exception parameter used but not declared in an inner class must be declared
final
.Any local variable used but not declared in an inner class must be definitely assigned (§16) before the body of the inner class.
Resources :