Accéder à un & # 8220; sans nom & # 8221; Jbutton dans une classe anonyme d'une autre classe anonyme?

StackOverflow https://stackoverflow.com/questions/286651

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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top