Question

Je me demandais s’il existait un moyen de mettre en œuvre un écouteur d’action pour un Jbutton sans nom. Par exemple, la boucle for suivante crée un bouton pour chaque lettre de l’alphabet.

for (int i = 65; i < 91; i++){
     alphabetPanel.add(new JButton("<html><center>" + (char)i));
}

Existe-t-il un moyen d'ajouter un écouteur d'action pour chacun de ces boutons sans se débarrasser de ma boucle for et de coder en dur chaque bouton JButton, puis de créer un écouteur d'action pour chacun?

Merci d'avance,

Tomek

Était-ce utile?

La solution

Votre question est un peu vague. il serait trivial de modifier la boucle pour ajouter un écouteur à l'intérieur de la boucle:

ActionListener listener = something;

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i);
     button.addActionListener( listener );
     alphabetPanel.add(button);
}

Si vous ne pouvez pas modifier la boucle, vous pouvez effectuer une itération sur tous les enfants du panneau et ajouter des écouteurs à l'un des enfants qui sont des boutons.

Aussi, pourquoi utilisez-vous HTML pour centrer le texte? n'est-ce pas exagéré? jbutton ne centre-t-il pas déjà le texte?
vous pouvez également utiliser setHorizontalAlignement (SwingConstants.CENTER).

Autres conseils

Quel est le problème de faire cela?

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i));
     button.addActionListener( new ButtonListener());
     alphabetPanel.add(button);
}

...

class ButtonListener implements ActionListener {
     ButtonListener() {
     }
     public void actionPerformed(ActionEvent e) {
         //TODO:
     }
}

En outre, si le texte du bouton n'identifie pas le bouton, vous pouvez définir le nom du bouton avec la lettre de l'alphabet.

button.setName((char)i)); // or button.setName(i);

Par named, vous semblez vouloir dire stocker l'occurrence de bouton dans une variable locale de votre méthode immédiate. Tenter d’éviter cela risque de rendre votre code plus difficile à lire. Mais pour répondre à votre question:

La méthode la plus évidente consiste à utiliser le vieux, mais populaire idiome à double accolade.

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}});

Remarque: dans ce cas, i n'étant pas final, il ne sera pas utilisable à partir de la classe interne anonyme. Affectez-la à une autre variable (finale) ou reformulez la boucle.

Une autre voie serait de passer par une action. (Habituellement, je suggère d'éviter les actions car elles sont simplement une table de hachage de pauvre. ButtonModel est "bon" bien.)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
    public void actionPerformed(ActionEvent event) {
        ...
    }
}));

Ensuite, bien sûr, il existe la méthode de bibliothèque spécifique à l'application:

Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
    alphabetForm.button("<html><center>" + c, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}

Il est possible d’ajouter ActionListener aux composants anonymes comme ci-dessous:

new JButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO your action             
            }           
        });

Toutefois, dans le cas où vous essayez d'ajouter JButton anonyme à votre panneau, cette approche ne fonctionnera pas car le type de retour de la méthode addActionListener (qui est vide) sera pris à la place du constructeur de JButton, comme indiqué ci-dessous:

for (int i = 65; i < 91; i++){
             alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        // TODO your action             
                    }           
                }));
        }

Le code ci-dessus se plaint d'un argument non valide pour la méthode panel.add ().

Donc, dans votre cas, vous devrez créer une instance nommée du JButton.

J'espère que cela clarifie.

Cordialement, Suresh

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