l'accès à la variable à l'intérieur de intérieur de la classe en java
Je suis en train de créer un tableau de JLabels, ils devraient tous aller invisible lorsque l'utilisateur clique dessus. Le problème vient lorsque vous essayez de configurer la souris auditeur à travers un intérieur de classe qui a besoin d'accéder à la variable d'itération de la boucle utilisée pour déclarer les étiquettes. Le Code est auto-explicatif:
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]);
}
J'ai pensé que je pouvais surmonter ce par l'utilisation de this
ou peut-être super
au lieu de l'appel de label[i]
dans l'intérieur de la méthode, mais je n'ai pas été en mesure de le comprendre.
L'erreur de compilation est: variable locale i est accessible depuis l'intérieur de intérieur de la classe; doit être déclarée final`
Je suis sûr que la réponse doit être quelque chose de vraiment stupide je n'ai pas pensé ou peut-être que je suis en train de faire quelques petites erreur.
Toute aide serait appréciée
local variable i is accessed from within inner class; needs to be declared final
alors peut-être vous devriez déclarer la variable comme
final
, non? (avoir un coup d'oeil à cette Q&A, aussi)De la balle, Ce n'est pas une bonne idée d'avoir la variable d'itérateur
final
.Similaire à stackoverflow.com/questions/14425826/...
OriginalL'auteur omtinez | 2010-10-10
Vous devez vous connecter pour publier un commentaire.
Votre variable locale doit être
final
pour être accessible de l'intérieur (et anonyme) de la classe.Vous pouvez modifier votre code pour quelque chose comme ceci :
De la JLS :
Ressources :
Hebert Vos "ressources" lien semble lier un autre document de la section 8.1.3
merci, ce fut en se référant à un précédent SÉMINAIRE, organisé par le soleil. C'est maintenant à jour.
Sed: a partir de Java SE 8, un local de classe peut accéder aux variables locales et des paramètres du bloc enfermant qui sont finales et efficacement final. Voir accéder aux membres d'une classe englobante
OriginalL'auteur Colin Hebert
Si vous rencontrez un problème d'accès à la
i
, faire une autre variable à l'extérieur de la portée de votre intérieur de la classe (par exemple, avantlabel[i].addMouseListener(...)
):Cela devrait fonctionner, mais. Colins solution est beaucoup plus agréable.
OriginalL'auteur
vous pouvez également utiliser
getSource
dans votre programme. Après cela, vous pouvez accéder à votre composant avec l'aide detypecasting
. il permettra de réduire les lignes de code supplémentaires,votre code devrait ressembler à ceci
OriginalL'auteur Devesh Jadon
Cela se produit parce que
label
n'est pas spécifié commefinal
.Déclarer le tableau d'étiquettes:
final JLabel[] label;
au lieu de:
JLabel[] label;
Votre
MouseAdapter
n'est pas un intérieur de classe; c'est un anonyme classe. Anonyme classes ne peut que se référer àfinal
variables de leur joignant code.En fait, c'est un anonyme intérieur de la classe, anonyme le sens qu'il n'a pas un nom explicite, et le sens profond, c'est contenue dans une autre classe.
OriginalL'auteur Isaac
Anonyme les classes internes ne peuvent accéder aux variables de la enfermant méthode qui sont
final
.OriginalL'auteur meriton