-
Portée d'un composant
Bonjour,
en étudiant l'excellent tutoriel de Baptiste WICHT sur le tableau avec JTable http://baptiste-wicht.developpez.com.../swing/jtable/, je constate que l'on ajoute des composants JPanel, contenant des JButton dynamiquement lors de l'exécution du constructeur de la classe fenêtre.
La question que je me pose: ces composants n'ont que la durée de vie de la méthode dans laquelle il sont déclarés et instanciés. Alors comment se fait-il que l'on arrive tout de même à les gérer alors que le constructeur a fini son travail ?
Si je me pose cette question, c'est parce que je suis en train de concevoir une fenêtre équipée d'un JPanel contenant des boutons, et une JTable dont les données évolues selon les ordres fournis par les boutons.
Faut-il que je déclare les composants comme membres de ma classe principale afin qu'ils aient la portée et durée de vie de toute mon application, ou est-ce que je peux leur laisser la portée du constructeur ?
-
Bonjour,
Il ne faut pas confondre portée et durée de vie.
La portée se limité peut-être au constructeur dans ce cas, mais tant qu'une référence existe vers tes composants, ils restent "en vie".
Et donc ta question, si j'ai bien compris c'est :
quand faut-il garder une référence explicite sur un composant "fils"?
J'aurais envie de répondre : quand tu en as besoin.
La plupart des composants n'ont pas besoins d'être conservés en référence car la plupart du temps, on leur affecte des listeners, models (ou autres) qui permettent de communiquer avec eux indirectement.
-
Merci beaucoup,
cette réponse est claire.
Le truc c'est que comme on ne gère pas les réservations mémoire (on fait des 'new' et jamais des 'delete' comme en C++), je me demandais ce que devenais tous ces objets déclarés "furtivement" dans un constructeur de classe.
Suite à votre réponse, je constate effectivement qu'il y a des 'Listeners' affectés à certains composants, et qui font le lien vers des méthodes de traitement d'évènement. (C'est subtil, je découvre :aie:)
Merci et à bientôt.
-
La JVM détermine (quand elle a envie) les objets qui ne sont plus référencés nul part et fait un delete pour toi. Le mécanisme est un peu compliqué... C'est ce qu'on appelle Garbage Collector.
D'ailleurs le delete n'a pas d'équivalent en java, de plus, toute référence à un objet est toujours valide, ce qui fait que des erreur du style "memory access violation at 0x...." ne peuvent jamais survenir (sauf si on utilise des librairies natives mais c'est une autre histoire).
Pour résumer, fait des new, et laisse java s'occuper du reste ! :mrgreen:
-
J'ajouterai juste un petit détail en ce qui concerne les objets déclarés dans un constructeur.
Quand tu construis un JPanel, si tu lui ajoutes un JButton dans le constructeur sans garder aucune référence vers ce JButton, une référence est créée lors de l'appel à add. En effet, un JPanel contient toujours une références vers tous les Component qu'il contient (enfin, c'est dans la classe Container que ça se passe, et JPanel hérite de cette dernière).
D'ailleurs, on peut récupérer ces références avec la méthode getComponents, mais c'est pas toujours très pratique de récupérer le composant exact qu'on veut quand il y en a plusieurs... :P