Wow ! Ca marche maintenant =)
Par contre je n'arrive pas à comprendre pourquoi, ni où était l'erreur.

Ce que j'ai maintenant, c'est un thread appellé après la création des objets Swing, qui contient des instructions pour injecter des données dans ces objets, + une instruction invokeLater() qui appelle... un autre thread (un Runnable) qui injecte les données les plus grosses (celles destinées au JTable). Bizarre ?

Je m'explique:

initComponents();
signalObject(obj);
> pack();
display();
Jusque la ca va.

Et la routine signalObject fait ceci:
 dataObj = obj; // OK
 SwingUtilities.invokeLater(new ManageObj(dataObj));
La ca ne va plus.

Pour finir, la routine ManageObj est un thread.
Certes mais il n'est jamais demarre ;-(
Pourquoi n'est-il jamais démarré ? Pourtant il l'est bien à un moment ou à un autre puisque les données finissent par être chargées, et sont affichées dans les composants Swing.

En fait il faut faire:
  new ManageObj(dataObj).start();
Ok, ca c'est donc fait juste après avoir créé les composants Swing.

et dans la méthode run():
  for each data
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run() { add_to_frame(data); }
    });
Et donc là, à l'intérieur du Thread, j'implémente un Runnable ?? Pour chacune des données à injecter en plus ? Que ce passe-t'il pour les instructions contenues dans le Thread (et non pas dans le Runnable qui y est inclu), et qui elles aussi injectent dans les composants Swing (de toutes petites quantités de données, cependant) ?

En résumé, le Thread est-il réellement utile ? Ne peut-on pas appeller, juste après avoir créé les composants Swing, directement des Runnable grâce à invokeLater() ? Ou le Thread qui les enveloppe a-t'il une fonction au niveau de la event queue qui assure que ces Runnable seront bien executés ?

Suivant ton type de composant, l'usage d'une methode fireXXX() du modele peut etre plus approprie.
Ah ! Je ne connaissais pas. Je vais regarder.

Et ca bloque pendant ce temps.
Normal  puisque tu bloques le thread (avec la tache ManageObj).
? Je ne comprends pas. Pourquoi mon thread initial (c'est à dire, justement ManageObj()) est-il bloqué ?

Le pire c'est que j'ai d'autres frames qui fonctionnent avec d'autres données et qui marchent.
Et que non: soit ce n'est pas le meme code, soit c'est tellement rapide que tu ne vois pas le delai.
Bah pourtant c'est exactement le même code (implémenté dans une classe mère dont dérivent les deux cas dont je parle), mais j'ai bien le comportement attendu, visible surtout lorsque j'affiche en même temps tout un tas de ces JInternalFrame: elles s'affichent, vides, puis progressivement les données y sont injectées. Remarque, il semble bien que je n'ai pas la main à ce moment... Mmm...

Aurélien

Répondre à