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 th
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 :
If you're having a problem accessing i, make another variable outside the scope of your inner-class (e.g. before 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]);
}
you can also use getSource in your program. After this you can access your component with the help of typecasting. it will reduce extra lines of code,
your code will look like this
for (int i = 1; i < label.length; i++) {
currentLabel.addMouseListener(new MouseAdapter(e) {
public void mouseClicked(MouseEvent me) {
JLabel label = (JLabel) me.getSource();
}
});
}
Anonymous inner classes may only access variables of the enclosing method that are final.
This happens because label is not specified as final.
Declare the array of labels as:
final JLabel[] label;
instead of:
JLabel[] label;
Your MouseAdapter is not an inner class; it's an anonymous class. Anonymous classes can only refer to final variables of their enclosing code.