java  

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)