Bien implémenter un Listener
Bonjour,
une question peut-être pas aussi purement philosophique qu'on pourrait le penser: Comment bien implémenter un Listener ? Je vais illustrer avec un ActionListener mais ma question est valable pour tous les Listener.
La première façons consiste à faire en sorte que la classe que l'on construit implémente ActionListener:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public class ExempleUn extends ActionListener{
public ExempleUn(){
...
JButton b1 = new JButton("bouton1");
b1.setActionCommand("lebouton1");
b1.addActionListener(this);
JTextField t1 = new JTextField();
t1.setEctionCommand("lazonetexte1");
t1.addActionListener(this);
...
}
public void actionPerformed(ActionEvent e){
String commande = e.getActionCommand();
if (commande.equals("lebouton1")){
//faire ce qu'il faut pour répondre un click sur le JButton b1
}
else if (commande.equals("lazonetexte1")){
//faire ce qu'il faut pour répondre à "Entrer" sur le JtextField t1
}
else if ...
}
} |
Avec un nombre de bouton important, pour peu que les traitements ne soient pas "légers" (plusieurs lignes de code), la méthode actionPerformed devient assez rapidement illisible.
La deuxième solution consiste à utiliser les classes anonymes
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
public class ExempleDeux{
public ExempleDeux(){
...
JButton b1 = new JButton("bouton1");
b1.setActionCommand("lebouton1");
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//faire ce qu'il faut pour répondre un click sur le JButton b1
}});
JTextField t1 = new JTextField();
t1.setEctionCommand("lazonetexte1");
t1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//faire ce qu'il faut pour répondre à "Entrer" sur le JtextField t1
}});
...
}
} |
mais il est rarement possible de faire le traitement directement et on fait alors le plus souvent appel à une méthode "dédiée":
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
public class ExempleTrois{
public ExempleTrois(){
...
JButton b1 = new JButton("bouton1");
b1.setActionCommand("lebouton1");
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
this.repondreAuBoutonUn();
}});
JTextField t1 = new JTextField();
t1.setEctionCommand("lazonetexte1");
t1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
this.repondreAuJTextFieldUn();
}});
...
}
public void repondreAuBoutonUn(){
//faire ce qu'il faut pour répondre un click sur le JButton b1
}
public void repondreAuJTextFieldUn(){
//faire ce qu'il faut pour répondre à "Entrer" sur le JtextField t1
}
} |
Et on peut du coup appliquer le même principe à ce qu'on avait sur l'exemple 1 ce qui rend la méthode actionPerformed un peu plus lisible
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
public class ExempleQuatre extends ActionListener{
public ExempleQuatre(){
...
JButton b1 = new JButton("bouton1");
b1.setActionCommand("lebouton1");
b1.addActionListener(this);
JTextField t1 = new JTextField();
t1.setEctionCommand("lazonetexte1");
t1.addActionListener(this);
...
}
public void actionPerformed(ActionEvent e){
String commande = e.getActionCommand();
if (commande.equals("lebouton1")){
this.repondreAuBoutonUn();
}
else if (commande.equals("lazonetexte1")){
this.repondreAuJTextFieldUn();
}
else if ...
}
public void repondreAuBoutonUn(){
//faire ce qu'il faut pour répondre un click sur le JButton b1
}
public void repondreAuJTextFieldUn(){
//faire ce qu'il faut pour répondre à "Entrer" sur le JtextField t1
}
} |
Ma question est donc parmis ces 4 méthodes (enfin surtout les deux dernières) laquelle est la meilleure ? Vous allez me répondre meilleure en quelle terme ? Ben justement, c'est un peu la question : les avantages de l'une ou l'autre en différents termes surtout de rapidité, sécurité, intégrité... car ici j'ai surtout vu le coté pratique à écrire (ce qui fit pencher pour la solution 3) mais ce n'est peut etre pas la meilleure sur d'autres critères ?
merci pour vos avis.
Bon code,
kerinel