Gestion d'événements et vous, vous faites comment ?

Gestion d'événements et vous, vous faites comment ? - Java - Programmation

Marsh Posté le 10-07-2002 à 09:43:31    

Perso, pour gérer un click sur un bouton, j'ai tendance à créer une classe interne qui implémente ActionListener et qui ne contient qu'une méthode spécifique à mon bouton. Je trouve ça propre et sympa.
 
exemple :

Code :
  1. private JButton button;
  2. button = new JButton("Click" );
  3. button.addActionListener(new ClickListener());
  4. class ClickListener implements ActionListener {
  5. public void actionPerformed(ActionEvent event) {
  6. }
  7. }


 
Et vous, quelles sont vos pratiques ? Quels trucs utilisez vous systématiquement ?


Message édité par Cherrytree le 10-07-2002 à 09:44:18

---------------
Le site de ma maman
Reply

Marsh Posté le 10-07-2002 à 09:43:31   

Reply

Marsh Posté le 10-07-2002 à 09:46:20    

Code :
  1. cancelButton.setText("Cancel" );
  2. cancelButton.addActionListener(new java.awt.event.ActionListener() {
  3.    public void actionPerformed(java.awt.event.ActionEvent evt) {
  4.       cancelButtonActionPerformed(evt);
  5.    }
  6. });
  7. // [...]
  8. private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
  9.    this.dispose();
  10. }


Message édité par darklord le 10-07-2002 à 09:46:52

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 10-07-2002 à 09:46:45    

heu moi, ça dépend des listener. Mais pour les boutons ou la souris, je fais dériver ma classe du listener directement ...
 
Mais quand c'est nu peu plus exotique, je fais une classe à part, ça permet de bien la repérer, et de pouvoir la réutiliser ...

Reply

Marsh Posté le 10-07-2002 à 09:48:11    

DarkLord a écrit a écrit :

Code :
  1. cancelButton.setText("Cancel" );
  2. cancelButton.addActionListener(new java.awt.event.ActionListener() {
  3.    public void actionPerformed(java.awt.event.ActionEvent evt) {
  4.       cancelButtonActionPerformed(evt);
  5.    }
  6. });
  7. // [...]
  8. private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
  9.    this.dispose();
  10. }





On reconnait la syntaxe de Forte. En tous cas, Forte fait comme ça, systématiquement.


---------------
Le site de ma maman
Reply

Marsh Posté le 10-07-2002 à 10:12:50    

tout à fait et je trouve ca relativement propre si tu n'as psa trop de boutons ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 10-07-2002 à 10:17:47    

DarkLord a écrit a écrit :

tout à fait et je trouve ca relativement propre si tu n'as psa trop de boutons ...



Je suis d'accord.


---------------
Le site de ma maman
Reply

Marsh Posté le 10-07-2002 à 10:24:19    

Bah, généralement, je m'arrange pour pas avoir 36 boutons dans la même classe, alors je fais implémenter ActionListener à ma classe, tout bêtement...

Reply

Marsh Posté le 10-07-2002 à 10:30:07    

ben quand c'est un truc simple, j'implémente directement l'interface qui va bien dans la classe qui génère l'évenement.
 
Du style  
 
class MaFrame extends JFrame implements ActionListener
{
...
monBouton.addActionListener(this);
...
 
public void actionPerformed(ActionEvent ae) {
...
}
...
}

Reply

Marsh Posté le 10-07-2002 à 10:39:05    

La variété des solutions possibles me fascine complètement.


---------------
Le site de ma maman
Reply

Marsh Posté le 10-07-2002 à 10:40:58    

Faut avouer que c'est bien pensé comme système.

Reply

Marsh Posté le 10-07-2002 à 10:40:58   

Reply

Marsh Posté le 10-07-2002 à 11:03:52    

lorill a écrit a écrit :

Faut avouer que c'est bien pensé comme système.




 
C'est clair, on serait même tenté de faire la même chose dans d'autres langages. Ces listener à toutes les sauces, c'est ben pratique tout de même !  :D

Reply

Marsh Posté le 10-07-2002 à 17:06:35    

Ouais, c'est de la belle ouvrage.


---------------
Le site de ma maman
Reply

Marsh Posté le 10-07-2002 à 17:53:21    

Cherrytree a écrit a écrit :

On reconnait la syntaxe de Forte. En tous cas, Forte fait comme ça, systématiquement.




 
JB aussi

Reply

Marsh Posté le 10-07-2002 à 17:53:56    

Houlà, moi, je me suis mitonné mon p'tit système, aussi, qui est assez pratique : dans mon client chat, j'ai une classe qui récupère les messages en provenance du serveur...Et comme je voulait pouvoir changer la GUI sans toucher au core, j'ai un système qui lance des évènements correspondants à des fonctionnalités du chat, mais comme j'ai plein d'évènements, et que je voulais pas me faire chier avec des addTotoListener()...
 
j'ai une seule méthode addListener(), et quand un évènement arrive, il détermine lui même quels listeners doivent le recevoir (c tout con, c à base de instanceOf, mais j'ai gagné en clarté à un point, avec ce truc! :D)

Reply

Marsh Posté le 10-07-2002 à 17:54:22    

perso jfait comme dark

Reply

Marsh Posté le 10-07-2002 à 22:07:18    

gfive a écrit a écrit :

Houlà, moi, je me suis mitonné mon p'tit système, aussi, qui est assez pratique : dans mon client chat, j'ai une classe qui récupère les messages en provenance du serveur...Et comme je voulait pouvoir changer la GUI sans toucher au core, j'ai un système qui lance des évènements correspondants à des fonctionnalités du chat, mais comme j'ai plein d'évènements, et que je voulais pas me faire chier avec des addTotoListener()...
 
j'ai une seule méthode addListener(), et quand un évènement arrive, il détermine lui même quels listeners doivent le recevoir (c tout con, c à base de instanceOf, mais j'ai gagné en clarté à un point, avec ce truc! :D)



C'est dommage que ton code soit propriété privée. Salaud de FT.

Reply

Marsh Posté le 10-07-2002 à 23:13:29    

:p Je bosse pas pour FT, et bon, c'est tellement con à faire que ça, je peux vous le passer ! :D
 
Alors :  
 
L'interface quidoivent implémenter mes évènements :  
 

Code :
  1. public interface MyEvent {
  2.   public abstract void handleEvent(Object listener);
  3. }

 
 
 
La classe qui manage les évènements (dans mon cas, le core du client chat)
 

Code :
  1. public class MyEventManager {
  2. blah blah....
  3. private Vector listeners = new Vector();
  4. public void addListener(Object listener) {
  5.    if (!listeners.contains(listener)) {
  6.          listeners.addElement(listener);
  7.    }
  8. }
  9. /** remove the given object from the MyEvent listeners list*/
  10.     public void removeListener(Object o) {
  11. listeners.removeElement(o);
  12.     }
  13.     /** Fire the given event to the appropriate listeners.*/
  14.     public void fireEvent(MyEvent event) {
  15. for (int i = 0; i < listeners.size(); i++) {
  16.     event.handleEvent(listeners.elementAt(i));
  17. }
  18.     }
  19. }

 
 
Et par exemple, pour le TotoEvent :
 
 

Code :
  1. public void handleEvent(Object listener) {
  2.     if (listener instanceof TotoListener) {
  3.       ((TotoListener)listener).totoEventOccured(this);
  4.     }
  5.   }

 
 
et dans l'interface TotoListener :  
 

Code :
  1. public interface TotoListener {
  2. public void totoEventOccured(TotoEvent event);
  3. }

 
 
Simple, non???
 

Reply

Marsh Posté le 10-07-2002 à 23:20:51    

J'avais aussi pensé à remplacer mon vecteur de listeners par une hashtable de vecteurs, référencés par noms de classes...Mais c pas pratique, pasqu'il faut que le core connaisse tous les types de listeners possibles (bah ouais, une classe peut implémenter plusieurs listeners) et donc, ça aurait été beaucoup moins dynamique : tel que c'est foutu là, je peux ajouter une classe d'évènement et le listener correspondant sans modifier l'existant.

Reply

Marsh Posté le 19-07-2002 à 12:10:25    

J'avais pas vu ta reply. Chouette méthode en tous cas. Et bien documentée, je te félicite. :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed