Java anonyme de la classe qui implémente ActionListener?
J'ai récemment fait une programmation de la mission qui nous a obligé à mettre en œuvre dans le code d'un programme spécifié par un diagramme UML. À un moment donné, le schéma spécifié que je devais créer un anonyme JButton qui affiche un nombre (à partir de) et décrémenté à chaque fois qu'il a cliqué. Le JButton et ses ActionListener a dû être anonyme.
Je suis venu avec la solution suivante:
public static void main(String[] args) {
JFrame f = new JFrame("frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 400);
f.getContentPane().add(new JButton() {
public int counter;
{
this.counter = 1;
this.setBackground(Color.ORANGE);
this.setText(this.counter + "");
this.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
counter --;
setText(counter + "");
}
});
}
});
f.setVisible(true);
}
Cela ajoute un anonyme, un JButton, puis ajoute un autre (intérieure) anonyme ActionListener pour gérer des événements et de mettre à jour le texte du bouton, tant que nécessaire. Est-il une meilleure solution? Je suis assez sûr que je ne peux pas déclarer un anonyme JButton implements ActionListener ()
, mais est-il un autre moyen plus élégant pour atteindre le même résultat?
- Regardez où vous êtes maintenant @Tim
Vous devez vous connecter pour publier un commentaire.
J'ai l'habitude d'aller quelque chose comme ceci:
AbstractAction implémente ActionListener ce qui devrait satisfaire à la tâche.
Il peut être une mauvaise pratique de l'écraser si le nombre de lignes de code, mais si vous êtes habitué à la lecture, alors il peut être très élégant.
C'est assez moche, mais vous pouvez effectuer les opérations suivantes à l'aide de l'ActionListener méthode et une classe anonyme:
Pour le rendre plus facile l'accès à la contre vous pouvez déplacer vers le haut niveau de votre classe et de l'accès à partir de deux endroits où setText est appelé.
La mise en œuvre de plusieurs types est généralement une mauvaise idée.
Il est rarement nécessaire d'étendre
JComponent
classes, bien que beaucoup de mauvais logiciels et tutoriels de le faire. Un idiome/hack qui a été gagne du terrain récemment est Double Croisillon - une classe est uniquement sous-classes afin de donner un exemple initialiser qui agit comme unwith
déclaration à partir d'autres langues.Dans ce cas, le code peut être écrit comme:
Si elle devient de plus en plus complexe, alors vous aurez probablement envie de faire un extérieur de la classe (ce qui ne veut pas mettre en œuvre
ActionListener
ou de prolongerJButton
) pour traiter les données.Noter également, vous devriez être en utilisant la
EventQueue.invokeLater
passe-partout pour s'assurer que les composants Swing ne sont jamais utilisés sur l'AWT (HAE).Je ne voudrais pas faire quelque chose comme ça dans le monde réel programme, mais étant donné les exigences de votre affectation, vous pouvez difficilement faire mieux.
Bien il existe une solution beaucoup plus élégante façon de le faire.
Malheureusement, c'est pas un Core Java/Swing approche.
Vous pouvez utiliser SwingBuilder en Groovy, pour obtenir le même résultat, en utilisant un peu plus laconique de la syntaxe, par exemple, pseudo code:
[http://groovy.codehaus.org/Swing+Builder%5D%5B1%5D
Je ne voudrais pas l'utiliser dans vos devoirs bien, j'ai vu des étudiants vraiment s'écartent de la norme et obtenir marquée vers le bas pour elle, mais au moins, vous pouvez l'inclure comme une avenue possible de poursuivre l'enquête.
Je pense que ce que vous avez à l'heure actuelle est tout à fait bien si.
C'est l'une des mauvaises pratiques tâches forcé de le faire dans les devoirs seulement 😉 Mauvaises choses:
Mais, alors .. on ne peut pas résister, pouvons-nous 😉 Voici une version à l'aide de l'Action qui leur est propre (ou du moins je le pense) que pour les deux premières question, lisible comme tous les autres exemples (et j'ai triché, bien sûr: d'abord mis en œuvre anonyme, les classes, puis laissez-les IDE ne le inline