Accéder à un & # 8220; sans nom & # 8221; Jbutton dans une classe anonyme d'une autre classe anonyme?
-
08-07-2019 - |
Question
J'ai créé 26 JButton dans un actionListener anonyme
libellé comme chaque lettre de l'alphabet.
for (int i = 65; i < 91; i++){
final char c = (char)i;
final JButton button = new JButton("" + c);
alphabetPanel.add(button);
button.addActionListener(
new ActionListener () {
public void actionPerformed(ActionEvent e) {
letterGuessed( c );
alphabetPanel.remove(button);
}
});
// set the name of the button
button.setName(c + "");
}
J'ai maintenant une classe anonyme keyListener
, dans laquelle je souhaite désactiver le bouton en fonction de la lettre sur laquelle le clavier a été enfoncé. Donc, si l'utilisateur appuie sur A, le bouton A est désactivé. Est-ce même possible avec ma mise en œuvre actuelle?
La solution
Ne pourriez-vous pas simplement déclarer un tableau de 26 objets JButton au niveau de la classe, afin que les deux écouteurs puissent y accéder? Je pense que les classes internes anonymes peuvent accéder aux variables de classe ainsi qu’aux variables finales.
Autres conseils
Je ne sais pas si vous souhaitez désactiver le bouton ou souhaitez-vous le supprimer? Dans votre code, vous appelez supprimer et dans votre réponse, vous parlez de la désactivation. Vous pouvez y parvenir en ajoutant un KeyListener à l'alphabetPanel. Vous pouvez donc ajouter ceci juste avant de commencer la boucle for:
InputMap iMap = alphabetPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap aMap = alphabetPanel.getActionMap();
et au lieu de votre ActionListener ajouté à l'appel de JButton, appelez ceci:
iMap.put(KeyStroke.getKeyStroke(c), "remove"+c);
aMap.put("remove"+c, new AbstractAction(){
public void actionPerformed(ActionEvent e) {
// if you want to remove the button use the following two lines
alphabetPanel.remove(button);
alphabetPanel.revalidate();
// if you just want to disable the button use the following line
button.setEnabled(false);
}
});
Vous pouvez également parcourir les composants en comparant getText () à la touche enfoncée.
Comme quelqu'un d'autre l'a mentionné, les classes anonymes peuvent également accéder aux membres de la classe externe ainsi qu'aux finales locales