Gestion de l'affichage de jframe dans un programme lourd

Résolu
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 - 21 mai 2010 à 14:13
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 - 1 juin 2010 à 13:03
Bonjour à tous,
Mon problème est dû à mon programme qui est assez lourd :
Je cherche notamment à afficher une barre de progression via un thread. Or lorsque celle-ci apparait, elle n'affiche que le contenu qui se trouve derrière (En gros, seul le cadre s'affiche, mais le contenu est vide)
J'ai le même problème avec une fenêtre toute simple (sans thread) contenant un seul bouton. Pour le test, j'ai créé un programme simplifié qui affiche également cette fenêtre en faisant d'autres calculs, et là, il n'y a aucun problème. Donc, en gros, comment faire passer cette fenêtre - via un thread ou non - en priorité? (Ou alors une meilleur idée?)

Merci beaucoup de votre aide (Et désolé si je suis pas clair, hésitez pas à me le dire, j'essaierai d'être plus explicite :) ).

@+. Hermios

6 réponses

Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
1 juin 2010 à 13:03
Bon, j'ai finalement trouvé le problème : Je lancai une JFrame, puis en lancait une autre à partir de la première, qui donc la bloquait. Maintenant, une classe supérieur lance chaque Frame l'une après l'autre, et tout fonctionne.

En tout cas, merci de ton aide, ca m'a permis de comprendre le principe des threads et comment résoudre mon problème :)


@+. Hermios
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 mai 2010 à 14:38
Salut,

Il te faut utiliser le Thread d'affichage de swing pour tout ce qui est affichage de fenêtre, de composants ou autre, sinon, forcément, ton thread principal est totalement occupé lors de traîtement lourd, et tu obtiens ce genre de problème graphique.

je te laisse aller voir ceci.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
21 mai 2010 à 15:09
Salut,
D'abord, merci pour la réponse bien rapide :)
Ensuite, je ne comprend pas bien : Prenons le cas de ma barre de progression :
J'ai d'abord un GUI qui s'ouvre, je remplis mes paramètres, puis je lance l'exécution d'un prgm en fonction desdits paramètres. L'une des premières actions du nouveau prgrm est de fermer ce premier GUI (une JFrame), puis, plus tard, il lance la barre de progression sous la forme : threadProgression.run().
J'ai essayé la méthode invokeLaterAndWake(threadProgression), mais ca le fait planter.
Avec invokeLater, il plante pas, mais pas de changements.
J#ai même essayé en changeant la priorité de mon thread (setPriority(1)), en le définissant comme un nouveau daemon, j'ai essayé le repaint, ca ne change rien. Mon cadre s'affiche, vide, jusqu'à ce que le programme principale lui laisse un peu de travail.
Désolé de te demander ca aussi abruptement, mais tu pourrais me fournir un bout de code pour que je comprenne? Merci beaucoup

@+. Hermios
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 mai 2010 à 15:17
Salut,

Tu as essayé avec les bouts de code du lien que je t'ai donné afin de bien comprendre toutes les notions ? Ca vaut le coup de perdre une heure ou deux pour comprendre tout ce qui y est dit, crois-moi.

Le principe avec swing? c'est de ne laisser dans le thread d'affichage (EDT) que les routines de tracé, et de lancer tout les autres traîtement (instanciation, connexion à une base, chargement d'une image, etc. etc., bref, le plus gros du boulot) dans un autre thread lancé à part, ainsi, l'EDT pourra faire ce qu'il doit faire (le rafraichissement de l'interface) pendant que ton programme fait ce qu'il est censé faire (travail sur les données).

<modetroll>
Si tu ne fais pas comme cà, tu auras l'impression que ton programme rame, que java c'est lent, et que de toute façon, un langage interprêté n'est pas fait pour du travail lourd. SWING a de très bonne performance, mais encore faut-il savoir l'utiliser et ne surtout pas utiliser d'éditeur graphique du type de celui de netbeans qui produise un code si lamentable qu'il est tout juste fait pour être jeter à la poubelle.
</modetroll>
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
21 mai 2010 à 15:59
Ok, je vais regarder ca la semaine prochaine (Là, plus le temps, trop de trucs m'arrivent en même temps!)
Je te tiens au courant, merci beaucoup de ton aide


@+. Hermios
0
Hermios Messages postés 264 Date d'inscription dimanche 14 avril 2013 Statut Membre Dernière intervention 23 mai 2014 2
31 mai 2010 à 17:28
Salut Darksidious,
Alors j'ai essayé, mais j'y arrive pas.
D'abord, une remise dans le contexte :
J'ai un swing barre de progression, et un programme d'analyse. Le programme d'analyse fonctionne par étapes, et à chaque étape, la barre est updatée (Nouvelle valeur de la barre, nouveau texte dans la barre).
Pour simplifier, je lance l'analyse dans un nouveau thread.
Voici tout ce que je'ai pu essayer :
- Je lance en premier mon thread "Barre de progression", puis mon programme d'analyse-> Il initialise correctement ma barre, mais ne l'update pas
- Je lance l'analyse avecun invokelater, toujours après avoir lancé la barre.
->Idem
- Ma barre de progression est une frame, qui contient un runnable public pour l'update. J'initialise la barre de progression, puis le thread d'analyse, qui, au moment d'updater la barre, lance le runnable au format invokeandwait (Donc normalement, ca stoppe le thread courant, donc le thread d'analyse, et lance le thread secondaire)-> Là, c'est le drame, il plante de partout, me disant :
"Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
at java.awt.EventQueue.invokeAndWait(Unknown Source)
at javax.swing.SwingUtilities.invokeAndWait(Unknown Source)"

HELP!!! Merci beaucoup :)

@+. Hermios
0
Rejoignez-nous