Swing et threads
Aurelien Mazurie
Tue, 26 Nov 2002 09:12:44 -0800
Bonjour,
Il y a quelque chose que j'essaye de faire en Swing qui ne fonctionne
pas que je le voudrais. A la base, voilà ce que je veux faire:
- initialiser les composants d'une JInternalFrame pour qu'elle puisse
m'afficher des données
- afficher cette JInternalFrame (vide, donc)
- charger les données grâce à un thread
Le but est que la JInternalFrame s'affiche tout de suite, et qu'elle
se remplisse quand le processus de récupération des données sera
terminé (sans que cela bloque le reste du GUI). J'ai donc fait ceci, au
niveau du code de ma JInternalFrame (constructeur):
initComponents(); // j'initialise les composants... (une JTable)
signalObject(obj); // je signale que je veux utiliser les données de
"obj"
pack();
display(); // une routine qui affiche la JInternalFrame
Et la routine signalObject fait ceci:
dataObj = obj; // récupération de l'objet, tests sur celui-ci...
...
SwingUtilities.invokeLater(new ManageObj(dataObj));
Pour finir, la routine ManageObj est un thread dont la méthode run()
extrait les valeurs de l'objet, puis les injecte dans la JTable qui
avait été initialisée par initComponents().
Or, à chaque fois que j'invoque ma JInternalFrame, je n'ai d'affichage
de la fenêtre qu'après que les données se soient chargées... Et ca
bloque pendant ce temps. Le pire c'est que j'ai d'autres frames qui
fonctionnent avec d'autres données, codées selon le même principe, et
qui marchent (par contre la quantité de données à charger est bien
moindre): la fenêtre s'affiche "vide", puis les données sont présentées
une fois finies d'être chargées.
J'ai mis des flags un peu partout, qui me confirment que l'ordre
d'exécution est le suivant, et qui me paraît être ce que je voulais:
> initComponents()
> signalObject()
> pack()
> display()
> manageObject()
J'ai loupé quelque chose ?
Aurélien Mazurie
(ps: signalObject() est un intermédiaire dont j'ai besoin pour d'autre
raisons)