Bonjour à tous,
Jai un sérieux doute sur le moment où est effectué l'initialisation d'un membre lorsque l'on déclare une valeur par défaut lors de sa déclaration.
Il me semblait que ça se faisait lors de la création d'un nouvel objet possédant ces membres avant d'arriver dans son constructeur
(mais sans doute pas avant son super constructeur).
J'ai commencé une appli où je déclarais jusqu'à lors mes ActionListener comme des membres de ma classe les utilisants (appelons là "classPipo").
Je les définissais dans la foulée et lorsque je devais les associer avec un objet quelconque je faisais référence au membre.
Pour résumer, une fois que l'on a enlevé tout ce qui est en dehors du sujet présent, ça donne à peu près ça:
Jusque là rien de bien exotique et le comportement était celui attendu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public class classPipo extends JFrame{ protected JButton avatarButton; protected ActionListener globalActionMember = new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("globalActionMember: Action ["+e.getActionCommand()+"] performed!\n"); } }; classPipo(){ super(); Container contents = getContentPane(); this.avatarButton=new JButton(); this.avatarButton.addActionListener(globalActionMember); contents.add(this.avatarButton); } }
Un beau jour (hier pour être précis) je me suis lancé dans une opération de réorganisation de mon code de manière à faciliter la maintenance
(oui, je sais que 90% des problèmes viennent de ce genre de bonnes intentions).
En cours de route je me suis rendu compte que certaines l'action ne déclenchait plus du tout.
A force de chercher je me suis appercu qu'une init dans le constructeur réglait mon problème.
Ou encore si j'utilise une classion pour la gestion de mes action ça marche aussi nickel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class classPipo extends JFrame{ protected JButton avatarButton; protected ActionListener globalActionMember; classPipo(){ super(); Container contents = getContentPane(); this.globalActionMember = new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("globalActionMember: Action ["+e.getActionCommand()+"] performed!\n"); } }; this.avatarButton=new JButton(); this.avatarButton.addActionListener(globalActionMember); contents.add(this.avatarButton); } }
Mais en tout état de cause ça ne m'explique pas pourquoi la première version ne fonctionne pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class classPipo extends JFrame{ protected JButton avatarButton; protected class globalActionClass implements ActionListener { public globalActionClass(){super();} public void actionPerformed(ActionEvent e) { System.out.println("globalActionClass: Action ["+e.getActionCommand()+"] performed!\n"); } }; classPipo(){ super(); Container contents = getContentPane(); this.avatarButton=new JButton(); this.avatarButton.addActionListener(new globalActionClass()); contents.add(this.avatarButton); } }(ou plus).
Il y a donc quelque chose qui m'échape sur l'ordre d'initialisation et ce n'est pas sans me rappeler des problèmes de "rincage" de variables que je n'avais pas pris le temps de creuser et qui resemblaient beaucoup à des initialisations arrivant après l'entrée dans le constructeur.
Si vous avez les idées plus claires que moi sur ces problèmes d'init je suis preneur de vos éclaircissements.
merci,
JLB
Pour info: NetBeans IDE 5.0/Linux v 2.6.11 (running on i386)/Java jdk1.5.0_06
Partager