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

Composants Java Discussion :

GUI grisée quand je fais un expand sur un JTree


Sujet :

Composants Java

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 4
    Points
    4
    Par défaut GUI grisée quand je fais un expand sur un JTree
    Bonjour,

    J'ai un JTree assez grand :2000 entités.
    J'utilise ce code pour l'ouvrir:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    if (ae.getActionCommand().equals(SecBabel.getString("sec.expand")))
        {
          trace_.debug("Clicks on expand button");
          SwingWorker sw = new SwingWorker() 
          {
        	  //amell
            public Object construct()
            {
              AciModalityManager.startModality();
     
              return null;
            }
     
            public void expandAll(JTree tree) 
            {
              TreeNode root = (TreeNode)tree.getModel().getRoot();
     
              // Traverse tree from root
              expandAll(tree, new TreePath(root));
            }
     
            private void expandAll(JTree tree, TreePath parent) 
            {
              // Traverse children
              TreeNode node = (TreeNode)parent.getLastPathComponent();
              if (node.getChildCount() >= 0) 
              {
                for (Enumeration e=node.children(); e.hasMoreElements(); ) 
                {
                  TreeNode n = (TreeNode)e.nextElement();
                  TreePath path = parent.pathByAddingChild(n);
                  expandAll(tree, path);
                }
              }    
     
              tree.expandPath(parent);
            }
            public void finished()
            {
            	expandAll(fadViewTree_);
            	AciModalityManager.stopModality();
     
            }
     
    	  };
          sw.start("");
    Lors de l'éxécution de ce code, ma GUI devient toute grisée dés que je l'iconnifie.


    Pourrais-je améliorer ce code pour éviter que la GUI soit grisée?


    --Merci

  2. #2
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    La méthode finished() de SwingWorker est exécutée dans l'EDT (thread d'affichage graphique), et dedans tu fais appel à une grosse fonction, donc c'est normal que l'affichage se bloque.
    Essaie plutot de mettre l'appel expandAll(fadViewTree_); dans la méthode doInBackgound() de SwingWorker que tu surcharges. C'est cette méthode qui est exécutée dans un thread à part.

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Hi,

    est ce que ceci n'est pas en contradiction avec la régle de base : Un seul thread qui s'occuppe de l'affichage.

  4. #4
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par infaac
    Hi,

    est ce que ceci n'est pas en contradiction avec la régle de base : Un seul thread qui s'occuppe de l'affichage.
    Hum hum, bonne question... Qu'en pensent les pros du Swing ?

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    hi,

    pourquoi est ce que personne ne répond

    please help me

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par infaac
    est ce que ceci n'est pas en contradiction avec la régle de base : Un seul thread qui s'occuppe de l'affichage.
    Non : car ce qui c'est le parcours des différents noeuds qui doit prendre beaucoup de temps, et cela n'a rien à voir avec de l'affichage !

    De plus ton SwingWorker est un peu inutile car la seule tâche qu'il effectue en tâche de fond est de définir la modalité, ce qui devrait être dans l'EDT s'il s'agit bien de modifier la modalité de la fenêtre...

    Pour moi cela donnerait quelque chose comme cela :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    		if (ae.getActionCommand().equals(SecBabel.getString("sec.expand"))) {
    			trace_.debug("Clicks on expand button");
     
    			// A déplacer ici si on est bien dans l'EDT
    			AciModalityManager.startModality();
     
    			SwingWorker sw = new SwingWorker() {
    				// amell
    				public Object construct() {
     
    					// On parcours tous les noeuds en tâche de fond :
    					TreeNode root = (TreeNode) tree.getModel().getRoot();
     
    					// Traverse tree from root
    					expandAll(tree, new TreePath(root));
     
    					return null;
    				}
     
    				private void expandAll(final JTree tree, final TreePath parent) {
    					// Traverse children
    					TreeNode node = (TreeNode) parent.getLastPathComponent();
    					if (node.getChildCount() >= 0) {
    						for (Enumeration e = node.children(); e
    								.hasMoreElements();) {
    							TreeNode n = (TreeNode) e.nextElement();
    							TreePath path = parent.pathByAddingChild(n);
    							expandAll(tree, path);
    						}
    					}
     
    					// Lorsqu'on doit modifier l'interface on utilise l'EDT :
    					SwingUtilities.invokeLater(new Runnable() {
    						public void run() {
    							expandPathOnEDT(tree, parent);
    						}
    					});
     
    				}
     
    				private void expandPathOnEDT(JTree tree, TreePath parent) {
    					tree.expandPath(parent);
    				}
     
    				public void finished() {
    					AciModalityManager.stopModality();
    				}
     
    			};
    			sw.start("");
    		}
    a++

    PS : Si tu utilises Java 5.0, tu devrais plutôt utiliser la nouvelle version de la classe SwingWorker : https://swingworker.dev.java.net/

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 4
    Points
    4
    Par défaut still exist!!
    merci beaucoup de me répondre mais le problème existe encore cad que lors de l'expand, la GUI devient grisée quand je l'iconnifie ...


    Comment pouurais-je diminuer le temps de l'expand ?y-a t'il une optimisation à faire pour améliorer la performance?

Discussions similaires

  1. Collapse Module - autre image quand le div est expanded
    Par Brkahh dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 25/06/2008, 00h40
  2. Erreur quand je fais un .exe
    Par greg26 dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/10/2007, 17h30
  3. Réponses: 4
    Dernier message: 05/07/2007, 17h07
  4. Réponses: 4
    Dernier message: 07/06/2007, 15h33
  5. Réponses: 2
    Dernier message: 23/05/2007, 11h01

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