Quelle est la différence entre addActionListener(this) et addActionListener(new ActionListener)?
Je veux ajouter de la gestion d'événements pour les boutons, j'ai remarqué qu'il y a deux façons de le faire.
- Implémenter l'interface ActionListener et ensuite ajouter des écouteurs d'événement à l'aide des boutons.
Exemple:
countButton.addActionListener(this);
Et la dans la méthode ActionPerformed va exécuter pour afficher le résultat.
-
De ne pas implémenter l'interface ActionListener et au lieu de faire ceci:
countButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //Execute when button is pressed System.out.println("You clicked the button"); } });
Comment est la seconde méthode de travail?????!!!
Merci!
- Il fait la même chose, sauf le deuxième est un anonyme intérieur de la classe.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas nécessaire de définir une deuxième classe pour la première approche. Vous avez juste besoin d'ajouter de l'
public void actionPerformed(ActionEvent e)
méthode à l'intérieur de votre classe et de faire ce que vous voulez là-bas, après vous apportez votre classe implémente ActionListener. Vous pouvez utiliser une deuxième classe, si vous voulez, mais il n'est pas nécessaire. L'inconvénient est que vous devez spécifier la source de l'événement avec de longues si consolidés afin de prendre les mesures appropriées si vous avez plus d'un JButtons c'est à direLa deuxième approche est l'ajout d'un anonyme intérieure ActionListener à chaque composant. C'est une approche Orientée Objet, puisque vous avez une séparation plus claire de la fonctionnalité de vos widgets. Il est à l'avantage de définir une méthode supplémentaire appelée à l'intérieur de chaque actionPerformed, afin d'être en mesure d'utiliser ce librement et de se référer à la classe conteneur:
et de mettre en œuvre la méthode:
Votre question n'est pas exactement sur les auditeurs comme il est sur la façon dont les interfaces fonctionnent et comment vous pouvez instancier une classe en Java. Voici quelques points de détail:
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/AbstractButton.html#addActionListener(java.awt.event.ActionListener)
http://download.oracle.com/javase/1.4.2/docs/api/java/awt/event/ActionListener.html
Ce que vous pouvez faire ici, dans la plus ancienne possible est de créer une classe qui sera déclenché lorsque quelqu'un clique sur votre bouton:
Maintenant, une fois cela fait, vous pouvez faire un insance de il et ajoutez-la à un port d'écoute de votre bouton:
MyButtonActionListener myActionListener = new MyButtonActionListener ();
bouton.addActionListener(myActionListener);
D'autre part, en Java, vous pouvez instancier une classe anonimousy, ce qui signifie qu'au lieu d'avoir un gestionnaire à l'instance (comme myActionListener dans le code ci-dessus), vous venez de l'instancier à la volée dans le lieu que vous en avez besoin, et vous n'aurez pas de gestionnaire pour l'utiliser plus tard. Qu'est ce qui se passe dans votre code: un ActionListener mise en œuvre est déclarée est égale à la volée comme le paramètre de la méthode addActionListener, que, sur la mouche de la déclaration comprend également la déclaration que votre anonyme instance n'est pas une classe, mais qui implémente ActionListener, et de ce fait, votre anonyme déclaration doit donner de la mise en œuvre de la méthode actionPerformed.
Une troisième option est d'avoir une classe qui implémente ActionListener (et la méthode actionPerformed), et à l'intérieur de cette classe, si vous créez un JButton et vous souhaitez le passer en tant qu'auditeur une instance de la ecompasing classe, vous allez utiliser "présent" à l'appellent que, comme dans :
Il y a beaucoup de petits points de cette discussion (comme dans comment avez-vous appellent le "ce" sur un n classe anonyme benoit xvi a déclaré à l'intérieur d'une autre classe, et comment vous appellent le "présent" de l'englobant instance de classe). Je vous recommande de lire un livre sur le Programmeur Java Certifié Sun de certification, il a un chapitre consacré à cette
Cela crée une classe anonyme qui implémente la méthode actionPerformed. De cette façon, vous n'avez pas à définir une nouvelle classe pour chaque endroit que vous souhaitez pour gérer un événement.
Il fonctionne de la même manière que la première technique c'est à dire La méthode attend un objet implémentant l'interface ActionListener. Toutefois, les deux techniques a ses propres avantages et inconvénients. La première technique permet une utilisation simple de l'objet au détriment de l'encombrement des si/d'autre code, parce que même méthode de gestion d'événements pour de multiples boutons. La deuxième technique permet nettoyeur de séparation de la logique pour chaque bouton de la charge de la création de plusieurs objets anonymes (pour chaque bouton).
De toute façon, pour ajouter un ActionListener vous avez besoin d'une classe qui implémente l'interface ActionListener (qui définit une seule méthode,
actionPerformed
).addActionListener(this)
implique quethis
implémente cette interface, et de toute action effectuée appellerathis.actionPerformed
.Dans le second cas, ce que vous faites est de créer une nouvelle, anonyme, de la classe qui implémente l'interface ActionListener. Lorsque
countButton
est cliqué, laactionPerformed
méthode appelée est la seule de la classe anonyme.