2008-11-13 8 views
1

J'ai créé 26 JButton dans un anonyme actionListener marqué comme chaque lettre de l'alphabet.Accéder à un Jbutton "anonyme" dans une classe anonyme d'une autre classe anonyme?

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 + ""); 
} 

Maintenant, j'ai une classe keyListener anonyme, où je voudrais désactiver le bouton basé hors de cette lettre a été enfoncée sur le clavier. Ainsi, si l'utilisateur appuie sur A, le bouton A est désactivé. Est-ce même possible compte tenu de ma mise en œuvre actuelle?

Répondre

6

Ne pourriez-vous pas simplement déclarer un tableau de 26 objets JButton au niveau de la classe, afin que les deux auditeurs puissent y accéder? Je crois que les classes internes anonymes peuvent accéder aux variables de classe ainsi qu'aux variables finales.

+0

Ou même les stocker dans une carte calée par caractère, de sorte que vous pouvez rechercher une instance DButton par le caractère. –

1

Je ne sais pas si vous voulez désactiver le bouton ou si vous voulez le supprimer? Dans votre code, vous appelez remove et dans votre réponse, vous parlez de désactiver. Vous pourriez y parvenir en ajoutant un KeyListener à l'alphabetPanel. Donc, vous pouvez ajouter ce 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é au DButton appeler 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); 
    } 
}); 
0

Vous pouvez également itérer les composants, en comparant getText () à la touche enfoncée.

Comme quelqu'un a mentionné, les classes anonymes peuvent également accéder à des membres de la classe externe, ainsi que les finales locales

Questions connexes