Votre question

[JAVA] Problème rafraîchissement JFrame

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
12 Novembre 2009 18:09:08

Bonjour tout le monde,

je sais que l'on trouve beaucoup de sujet comme celui-ci sur la toile mais aucun d'entre eux ne m'a permis d'arriver à mes fins.

Je réalise un programme Java dont l'interface graphique est basée sur la bibliothèque Swing.
Ce programme doit se connecter à une base de données, la modifier puis copier des fichiers (contenus dans le .jar) dans des répertoires (utilisation de Runtime). Vous l'aurez compris, il s'agit d'une mise à jour.

Je n'ai aucun soucis dans la réalisation de ces étapes, cependant j'ai un problème au niveau graphique.

Le programme se compose de deux écrans :
- 1er écran : L'utilisateur indique le répertoire d'installation du logiciel à mettre à jour (via un JFileChooser)
- 2nd écran : en même temps que les actions de mise à jour sont réalisées, le programme écrit dans une JTextArea tout ce qu'il fait.

exemple :
"Mise à jour de la base de données..."
"Copie des fichiers en cours..."

Cependant je n'arrive pas à rafraichir correctement ma JFrame au passage des deux écrans.
J'obtiens une fenêtre correctement redimensionnée mais dont le contenu est tout blanc.
Seulement lorsque toutes les actions sont terminées, j'ai le rafraichissement avec tout le texte écrit.

Pour rafraichir, j'ai essayé plusieurs méthodes :
- setVisible(false); setVisible(true) => pas beau, et ça ne fonctionne pas
- setSize(getSize()) => ne fonctionne pas non plus
- repaint() => idem
- revalidate() => idem

J'ai aussi essayé avec un thread qui rafraichi régulièrement mais sans succès.

Auriez-vous une idée ?

Merci d'avance.

Autres pages sur : java probleme rafraichissement jframe

a b L Programmation
12 Novembre 2009 20:37:16

As-tu tenté le invalidate() suivi du revalidate() ?
Ton traitement se trouve-t-il dans l'exécution d'un évènement graphique? quel évènement? parce que si ton programme attend d'avoir finit de traiter l'évènement pour traiter les autres (la gestion évènementielle n'est pas multi-tâches), ça ne risque pas de faire grand chose.
As-tu surchargé la méthode paint pour voir si tu passais bien dedans?

Ton thread tu dois l'utiliser pour l'exécution des tâches de traitement (la mise à jour de la base et la copie des fichiers), c'est à toi à verrouiller les actions utilisateur tant que le thread n'est pas terminé.
m
0
l
13 Novembre 2009 18:47:41

J'ai testé avec invalidate() puis validate() // je n'ai pas "revalidate()"
Aucun changement, mais effectivement je n'entre pas dans "paint(g)"

Voici mon architecture :

classe Model
=> Elle dirrige les opérations, c'est à dire qu'au lancement des traitements, elle crée le thread puis réalise :
  1. while(thread.isAlive()){
  2. try {
  3. Thread.sleep(200);
  4. } catch (InterruptedException e) {
  5. // TODO Auto-generated catch block
  6. e.printStackTrace();
  7. }
  8. vue.invalidate();
  9. vue.validate();
  10. vue.repaint();
  11. }



classe myThread extends Thread
=> Elle exécute les traitements, c'est à dire connexion et modification de la base de données puis copie des nouveaux fichiers

voici un squelette de sa méthode run()


  1. public void run(){
  2. connexion à la base de données
  3. écriture d'un commentaire dans la vue
  4. Thread.sleep(50); // Pour laisser le temps au Model de rafraichir la vue
  5.  
  6. modification bdd
  7. Thread.sleep(50);
  8.  
  9. ...
  10. }


Au niveau du paint.
J'y n'entre pas pendant les traitements (malheureusement), mais lorsque ces derniers sont terminés, j'y passe.

Merci d'avance.


EDIT:

Je viens de trouver que c'est la connexion à la base de données qui bloque tout.
Je vais essayer de faire de multiples connexions pour laisser le rafraichissement se faire.
m
0
l
Contenus similaires
14 Novembre 2009 17:54:37

Bon finalement j'ai trouvé une solution alternative.

J'ai un thread qui exécute tous les traitements. Et au lieu de le lancer avec thread.start(), j'utilise invokeLater().

Cela me permet d'afficher du texte avec mon model.

C'est pas encore top parce que du coup j'ai un message d'afficher au lancement du traitement et puis c'est tout,le reste arrive lorsque tout est terminé.
m
0
l
a b L Programmation
14 Novembre 2009 18:37:21

Je ne me rappelle plus en Java, mais normalement tu dois pouvoir envoyer un event (en post pas en send pour ne pas faire l'exécution de l'event dans le thread courant).
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS