IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Thread graphique ?


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut Thread graphique ?
    Bonjour,
    J'affiche un splash screen durant le démarrage d'une application desktop (chargement des données et création de l'interfaces graphique). J'y ai rajouté un JLabel pour mettre un texte correspondant au chargement mais le texte que je sette ne se met pas à jour.
    Je pense que c'est lié au Thread graphique... ?

    Si quelqu'un pouvait m'éclairer un peu à ce sujet. Merci

  2. #2
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Bonjour, on ne pourra pas te dire d'où cela vient sans voir ton code

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    Oui..c'est vrai, mais en fait j'ai avancé un peu.
    Voici la méthode qui me lance mon application

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    public void start() {
       try {		
          GUIProtect.getInstance().activateProtection(true);
          final Frame splashFrame = SplashWindow.getInstance().getFrame("Mon application");
           EventQueue.invokeLater(new Runnable() {
              public void run() {
    	   try {
    	      SplashWindow.getInstance().setTextChargement("Authentification");
                 userLogin();
     
    	     SplashWindow.getInstance().setTextChargement("Mise à jour de la structure des données");
    	     BusinessHome.getInstance().checkDbUpdate();
    	     SplashWindow.getInstance().setTextChargement("Création de l'interface graphique");
                 ...
    	    SplashWindow.getInstance().setTextChargement("Ouverture de l'application");
                ....
                if (splashFrame != null) splashFrame.dispose();
    	  } catch (Exception ex) {
    	      ex.printStackTrace();
    	  }
           }
         });
      } catch (Exception ex) {
           ex.printStackTrace();
       }
    }
     
             public static void main(String[] args) {
    		MyLauncher launcher = new MyLauncher();
    		launcher.initSecurityManager();		
    		launcher.initJNDIProperties();
    		launcher.initDebugOutput();
    		launcher.initLookAndFeel();
    		launcher.start();
    	}
    J'ai remarqué que si j'enlève le EventQueue.invokeLater(), la mise à jour de mon splashscreen se fait bien ; mais mon look & feel n'apparait plus.
    Merci

  4. #4
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Je pense que tu dois remplacer EventQueue.invokeLater par SwingUtilities.invokeLater.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    Je l'avais déjà testé hier, mais dans ce cas, c'est le texte de mon splashscreen qui ne se met pas à jour : il me m'affiche "Authentification" tout le long. C'est pour ca que je me demande si ce n'est pas le fait que le thread graphique est occupé à créer son interface et tout, et vient me mettre à jour mon texte quand il n'est plus occupé...(c'est de la supposition, je ne suis pas très calé en thread)

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par CheryBen Voir le message
    Je pense que tu dois remplacer EventQueue.invokeLater par SwingUtilities.invokeLater.
    Logiquement ce serait mieux, mais en réalité c'est exactement la même chose (AWT et Swing partagent le même thread graphique ).



    livoo > Ton problème vient du fait que tu fais TOUT dans le thread graphique, alors que ce dernier ne doit servir qu'à mettre à jour l'affichage.

    En clair tout ce qui touche à l'interface graphique (mise à jours, etc.) DOIT être fait dans l'EDT via invokeLater() ou d'autres méthodes (SwingWorker par exemple), et tout le reste (entrées/sorties, accès BD, etc.) doit être fait en dehors afin de ne pas bloquer l'affichage...


    a++

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    Merci adiguba.
    DOIT être fait dans l'EDT
    C'est quoi l'EDT ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void start() {
       try {		
          GUIProtect.getInstance().activateProtection(true);
          final Frame splashFrame = SplashWindow.getInstance().getFrame("Mon application");
           EventQueue.invokeLater(new Runnable() {
              public void run() {
    	   try {
    	      SplashWindow.getInstance().setTextChargement("Authentification");
                 userLogin();
     
    	     SplashWindow.getInstance().setTextChargement("Mise à jour de la structure des données");
    	     BusinessHome.getInstance().checkDbUpdate();
    	     SplashWindow.getInstance().setTextChargement("Création de l'interface graphique");
    Mais si, dans mon cas, je veux lancer la mise à jour de la bdd (checkDbUpdate()) après l'authentification (qui est une dialog classique login/mdp), je ne vois pas exactement comment faire (en sachant qu'après la mise à jour de la base, j'ai encore du traitement graphique)
    Et puis il y a quelque chose que je comprends pas : c'est que, d'accord, le traitement qui est fait dans le thread graphique n'est pas bon, mais, après la mise à jour de la base, il devrait me mettre à jour mon label en "Création de l'interface graphique"... non ?

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par livoo Voir le message
    C'est quoi l'EDT ?
    L'EDT (Event dispatch Thread) est justement le thread graphique, qui se charge de l'affichage et de la gestion des événements (souris, clavier, etc.).

    C'est le thread qui est utilisé lorsque tu fait invokeLater() ou dans les listeners.

    Mais comme il gère l'affichage, tu ne dois pas le surcharger avec du code trop "long" sous peine d'avoir des problèmes graphiques.


    Donc tes traitements doivent être exécuté dans un thread, et il ne doit y avoir que la mise à jour de l'affichage dans les invokeLater()....


    Plus d'info : Threads et performance avec Swing

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/08/2012, 18h18
  2. Réponses: 3
    Dernier message: 15/10/2008, 16h14
  3. JavaME : Timer et thread graphique
    Par ®om dans le forum Java ME
    Réponses: 5
    Dernier message: 31/01/2008, 15h31
  4. Enchainer plusieurs Threads "graphique"
    Par RR instinct dans le forum EDT/SwingWorker
    Réponses: 15
    Dernier message: 17/10/2007, 03h28
  5. [thread]bug graphique?
    Par norkius dans le forum Interfaces Graphiques en Java
    Réponses: 17
    Dernier message: 24/03/2005, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo