Des tutos super clair que je découvre aujourd'hui en cherchant les avantages et inconvénients sur une interface par rapport à une classe abstraite ... et réciproquement.
Bonjour, merci pour ce tuto :) Dans un GUI, quand on a plusieurs objets types différents qui ont besoin de listeners (combo box, spinner, boutons...) c est quelle(s) façon(s) d implémenter ces listeners qui serait la plus adaptée ? Inner class ? une classe normale ? ...
Merci Dominique pour ces super tutos ! J'ai cependant un souci avec l'exemple2 que je ne parviens pas à résoudre: Dans la classe BtnClickMeListener(), j'ai bien déclaré : JFrame frame = (JFrame) btn.getTopLevelAncestor(); le ... frame.setTitle(btn.getText()); ... fonctionne bien, par contre, je n'ai pas accès à ... frame.btnActivateMe malgré l'avoir rendu public dans Example2.java frame.btnActivateMe.setText("hello"); => btnActivateMe cannot be resolved or is not a field Aurais-tu une idée ?
Bonjour. Malheureusement je bloque dès le début de la vidéo. En effet, je ne comprends pas à quoi correspond le this à la ligne de code suivante :" this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);". Puis bien évidemment dans les autres cas ou this est utilisé :"this.setSize(600,400);" etc. Enfin dans le cas ou this est utilisé dans la ligne de code suivante : btnClickMe.add(this). Ces this font-il référence un objet instancié par la classe exemple ? suis-je totalement à l'ouest ? ;) Par ailleurs, lorsque l'on fait "contentPane.setLayout(new FlowLayout)" cela revient il à : "contentPane.setLayout(FlowLayout flow=new FlowLayout)". En cherchant un peu j'ai pu comprendre que cela revenait grosso modo au même ? est-ce le cas ? J'en conviens cela fait énormément de questions :/ ... Mais je te suis très reconnaissant pour le boulot que tu fournis. Grace à toi je me réconcilie avec la POO et espère (dans 100 ans) arriver à ton niveau. Merci encore !
Bonjour. En fait c'est simple. Dans une méthode, this représente l'objet (l'instance) sur lequel la méthode est invoquée. A fortiori, dans un constructeur, this représente l'objet en cours d'initialisation. Donc ici, this représente la fenêtre en cours de construction/initialisation. En fait, ce this n'est pas forcément obligatoire (à défaut c'est this qui est considéré), mais perso, j'aime bien rappeler sur quel objet de travail. Petit conseil, regarde de nouveau ce tuto qui doit en parler : ua-cam.com/video/MUmcqiMchUE/v-deo.html Bon courage. Dominique
J'ai pensé à une autre solution: celle d'un listerner dans une classe externe avec un constructeur qui prend en parametre la classe qui appelle: Dans la classe MyJframeCaller qui porte le button on fait btnClickMe.addActionListener(new BtnClickMeListenerWithCaller(this)); public class BtnClickMeListenerWithCaller implements ActionListener { private MyJframeCaller caller = null; public BtnClickMeListenerWithCaller(MyJframeCaller caller) { this.caller = caller; } @Override public void actionPerformed(ActionEvent arg0) { caller.setTitle("Mon title"); } }
Bonjour, en faisant un petit déboguage dans la méthode actionPerformed et en regardant l'ensemble des valeurs liés aux évenements (et il y a en beaucoup [surtout dans event.source?] lol), je me suis aperçu qu'il existe une méthode "getActionCommand( )" et cette méthode retourne justement un string, je ne connais pas la finalité de cette méthode par rapport à la méthode getText(). Cette méthode getActionCommand( ) retourne le texte du bouton cliqué. Du coup le switch devient possible switch(event.getActionCommand()) { case "Bouton 1": System.out.println("Bouton 1 cliqué"); break; case "Bouton 2": System.out.println("Bouton 2 cliqué"); break; case "Bouton 3": System.out.println("Bouton 3 cliqué"); break; default: throw new IllegalArgumentException("Aucun bouton cliqué: " + event); }] j'ai mis un default mais je suis me suis inspiré de la javadoc API sur switch et string car je ne savais pas quoi mettre...je pense que le default n'aura jamais lieu en faite car cliquer en dehors du bouton ne gere pas cet event(en tout cas pour l'instant...)
Bonjour. Un petit conseil, évite getActionCommand et getText : c'est deux méthodes renvoient des chaînes de caractères et comparer des string n'est pas très performant. Sur d'autre type d'événements (MouseEvent) ce serait très pénalisant. Préfère utiliser event.getSource() qui renvoit un pointeur sur l'éméteur de l'événement. Comparer des pointeur c'est plus éfficace.
Ah ok merci. Je t'avouerai que la gestion des pointeurs n'a jamais été mon fort que je faisais un peu de C. Là je comprend mieux, event.getSource() renvoit une référence vers l'objet émetteur(un hashcode). Pourtant ton idée de départ avec le switch nous aurait bien facilité la tâche. surtout que dans mes "case" du switch j'avais aussi rajouter this.setTitle("Bouton x"); De plus , en tentant de genérer un 4eme bouton avec WindowBuilder, il est vrai que la génération de code automatique ressemble à "btnBouton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Bouton 4 cliqué"); } });" Et donc comme tu l'avais dit, avec une classe anonyme (je ne connaissais pas cette notion).Ce serait donc la meilleur optimisation possible. En faite, je m'interroge sur l'organisation de code, je pense par exemple à l'idée de départ qui consiterait à organiser son projet en mettant l'ensemble des écouteurs dans un package, un package pour les containers et les components puis d'instancier de extérieures en utilisant les interfaces(non GUI)...faire un mixte avec les classes anonymes
Peut-être devrais tu aussi suivre ce tuto : www.youtube.com/watch?o=U&video_id=DjHC-C-GXUc Il compléte les techniques pouvant permettre de coder un gestionnaire d'événements. Peut-être que ce complément te sera utile dans ta réflexion.
Des tutos super clair que je découvre aujourd'hui en cherchant les avantages et inconvénients sur une interface par rapport à une classe abstraite ... et réciproquement.
très bonne vidéo, merci :)
magnifique!!! bravo continuez à nous faire aimer vos cours , c'est un délice
Merci infiniment pour vos explications bien détaillés
Vos cours sont pédagogiques. Merci
Merci sur votre tutoriel ,bon explication
merci
merci beaucoup pour ce tuto, grace a vous j'ai pas eu une bonne note :)
Merci! Dommage et incompréhensible le nombre peu élevé de vos abonnés.
Bonjour, merci pour ce tuto :)
Dans un GUI, quand on a plusieurs objets types différents qui ont besoin de listeners (combo box, spinner, boutons...) c est quelle(s) façon(s) d implémenter ces listeners qui serait la plus adaptée ? Inner class ? une classe normale ? ...
the best
Merci Dominique pour ces super tutos !
J'ai cependant un souci avec l'exemple2 que je ne parviens pas à résoudre:
Dans la classe BtnClickMeListener(), j'ai bien déclaré :
JFrame frame = (JFrame) btn.getTopLevelAncestor();
le ... frame.setTitle(btn.getText()); ... fonctionne bien, par contre,
je n'ai pas accès à ... frame.btnActivateMe malgré l'avoir rendu public dans Example2.java
frame.btnActivateMe.setText("hello"); => btnActivateMe cannot be resolved or is not a field
Aurais-tu une idée ?
Bonjour. Malheureusement je bloque dès le début de la vidéo. En effet, je ne comprends pas à quoi correspond le this à la ligne de code suivante :" this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);". Puis bien évidemment dans les autres cas ou this est utilisé :"this.setSize(600,400);" etc. Enfin dans le cas ou this est utilisé dans la ligne de code suivante :
btnClickMe.add(this). Ces this font-il référence un objet instancié par la classe exemple ? suis-je totalement à l'ouest ? ;)
Par ailleurs, lorsque l'on fait "contentPane.setLayout(new FlowLayout)" cela revient il à : "contentPane.setLayout(FlowLayout flow=new FlowLayout)". En cherchant un peu j'ai pu comprendre que cela revenait grosso modo au même ? est-ce le cas ?
J'en conviens cela fait énormément de questions :/ ... Mais je te suis très reconnaissant pour le boulot que tu fournis. Grace à toi je me réconcilie avec la POO et espère (dans 100 ans) arriver à ton niveau. Merci encore !
Bonjour. En fait c'est simple. Dans une méthode, this représente l'objet (l'instance) sur lequel la méthode est invoquée. A fortiori, dans un constructeur, this représente l'objet en cours d'initialisation. Donc ici, this représente la fenêtre en cours de construction/initialisation. En fait, ce this n'est pas forcément obligatoire (à défaut c'est this qui est considéré), mais perso, j'aime bien rappeler sur quel objet de travail. Petit conseil, regarde de nouveau ce tuto qui doit en parler : ua-cam.com/video/MUmcqiMchUE/v-deo.html
Bon courage.
Dominique
Merci dominique !
J'ai pensé à une autre solution: celle d'un listerner dans une classe externe avec un constructeur qui prend en parametre la classe qui appelle:
Dans la classe MyJframeCaller qui porte le button on fait
btnClickMe.addActionListener(new BtnClickMeListenerWithCaller(this));
public class BtnClickMeListenerWithCaller implements ActionListener {
private MyJframeCaller caller = null;
public BtnClickMeListenerWithCaller(MyJframeCaller caller) {
this.caller = caller;
}
@Override
public void actionPerformed(ActionEvent arg0) {
caller.setTitle("Mon title");
}
}
Bonjour, en faisant un petit déboguage dans la méthode actionPerformed et en regardant l'ensemble des valeurs liés aux évenements (et il y a en beaucoup [surtout dans event.source?] lol), je me suis aperçu qu'il existe une méthode "getActionCommand( )" et cette méthode retourne justement un string, je ne connais pas la finalité de cette méthode par rapport à la méthode getText().
Cette méthode getActionCommand( ) retourne le texte du bouton cliqué. Du coup le switch devient possible
switch(event.getActionCommand()) {
case "Bouton 1":
System.out.println("Bouton 1 cliqué");
break;
case "Bouton 2":
System.out.println("Bouton 2 cliqué");
break;
case "Bouton 3":
System.out.println("Bouton 3 cliqué");
break;
default:
throw new IllegalArgumentException("Aucun bouton cliqué: " + event);
}]
j'ai mis un default mais je suis me suis inspiré de la javadoc API sur switch et string car je ne savais pas quoi mettre...je pense que le default n'aura jamais lieu en faite car cliquer en dehors du bouton ne gere pas cet event(en tout cas pour l'instant...)
Bonjour. Un petit conseil, évite getActionCommand et getText : c'est deux méthodes renvoient des chaînes de caractères et comparer des string n'est pas très performant. Sur d'autre type d'événements (MouseEvent) ce serait très pénalisant. Préfère utiliser event.getSource() qui renvoit un pointeur sur l'éméteur de l'événement. Comparer des pointeur c'est plus éfficace.
Ah ok merci. Je t'avouerai que la gestion des pointeurs n'a jamais été mon fort que je faisais un peu de C. Là je comprend mieux, event.getSource() renvoit une référence vers l'objet émetteur(un hashcode). Pourtant ton idée de départ avec le switch nous aurait bien facilité la tâche. surtout que dans mes "case" du switch j'avais aussi rajouter this.setTitle("Bouton x");
De plus , en tentant de genérer un 4eme bouton avec WindowBuilder, il est vrai que la génération de code automatique ressemble à "btnBouton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Bouton 4 cliqué");
}
});"
Et donc comme tu l'avais dit, avec une classe anonyme (je ne connaissais pas cette notion).Ce serait donc la meilleur optimisation possible.
En faite, je m'interroge sur l'organisation de code, je pense par exemple à l'idée de départ qui consiterait à organiser son projet en mettant l'ensemble des écouteurs dans un package, un package pour les containers et les components puis d'instancier de extérieures en utilisant les interfaces(non GUI)...faire un mixte avec les classes anonymes
Peut-être devrais tu aussi suivre ce tuto : www.youtube.com/watch?o=U&video_id=DjHC-C-GXUc
Il compléte les techniques pouvant permettre de coder un gestionnaire d'événements. Peut-être que ce complément te sera utile dans ta réflexion.