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

AWT/Swing Java Discussion :

Texte d'une progressBar qui "freeze" lors d'un update(getGraphics());


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut Texte d'une progressBar qui "freeze" lors d'un update(getGraphics());
    Bonjour, dans mon application j'utilise une progressBar pour montrer l'avancement d'un chargement long( 15-20 secondes). Pour des problemes d'affichage majeurs (la ProgressBar qui se figeait ou qui plantait) j'ai du placer l'instruction maFrame.update(getGraphics()); a chaque fois que je met a jour ma progressBar (valeur et intitulé).
    Voici le bug qui en resulte (pas a chaque fois que la barre est mise a jour mais souvent).



    Comme vous pouvez le voir le texte apparait en double et n'est pas du plus bel effet. Si vous pouvez m'aider je vous en serais très reconnaissant car je bute sur ce problème sans entrevoir de solution. (Me passer de l'update est impossible au vu des bugs que cette instruction corrige).
    Merci d'avance

  2. #2
    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 Crowell
    Pour des problemes d'affichage majeurs (la ProgressBar qui se figeait ou qui plantait) j'ai du placer l'instruction maFrame.update(getGraphics()); a chaque fois que je met a jour ma progressBar (valeur et intitulé).
    Cette solution est encore pire que le problème original !!!

    Swing utilise un thread spécifique (EDT) pour dessiner les composants automatiquement lorsque c'est nécessaire ! Tu ne dois donc pas forcer la mise à jour de l'affichage de cette manière...

    Par contre il faut que tu sépares bien tes traitements des modifications des composants :
    • Tous les traitements lourds qui ne touchent pas à l'interface doivent être effectué dans un thread séparé.
    • Tout ce qui touche aux composants de ton interface graphique doit être effectué dans l'EDT (par exemple avec SwingUtilities.invokeLater())


    Plus d'info :


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    Le probleme c'est qu'il y a un lien fort entre le traitement lourd et l'affichage, l'application charge 54 composant l'un apres l'autre, et entre chaque chargement je calcule le pourcentage de progression et je met a jour l'affichage.
    Puis-je vraiment compter sur une solution avec thread...?

    Grossierement ça ressemble à ça actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (i = 0 ; i < 54 ; i++ ) {
    {
    chargement du composant i
    maj de la progress bar avec le texte i
    maj de la valeur avec i
    on force l affichage : update(getGraphics());
    }
    }

    Si je lis bien ta réponse, je rentre dans le 2e cas... le traitement influe sur l'affichage, reste à me renseigner car c'est un sujet que je ne maitrise absolument pas.

  4. #4
    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 Crowell
    Le probleme c'est qu'il y a un lien fort entre le traitement lourd et l'affichage, l'application charge 54 composant l'un apres l'autre, et entre chaque chargement je calcule le pourcentage de progression et je met a jour l'affichage.
    Puis-je vraiment compter sur une solution avec thread...?
    Oui oui et oui ! Sinon ton affichage ne sera mis à jours qu'à la fin de ton traitement...

    Ca deviendrait quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for (i = 0 ; i < 54 ; i++ ) {
    {
    chargement du composant i
    SwingUtilities.invokeLater( new Runnable() {
        public void run() {
            maj de la progress bar avec le texte i
            maj de la valeur avec i
       }
    });
    }
    }
    Mais le mieux serait d'utiliser SwingWorker : c'est fait pour cela

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    Merci pour tes réponses je vais m'atteler à réaliser la solution la plus propre possible car la gestion des threads est un probleme majeur et récurrent, il n'y a qu'a voir la liste des questions posées sur ce forum à ce sujet...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    Et voila, la solution avec Swingworker fonctionne très bien avec un affichage parfait (et je n'ai pas retrouvé les bugs de la JProgressBar qui se figeait, etc donc tout va bien).
    Un dernier point tout de même dans ma classe appellante je crée une instance de ProgressDialogue, la classe qui creer une progressBar et qui l'affiche, et qui fait le traitement lourd (15 sec) a coté. Je dois attendre que le chargement soit terminé pour continuer le traitement dans la classe appellante (a savoir afficher les resultats, etc..) et j'utilise une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (endLoad != true ) {}
    sachant que endLoad passe a true dans la méthode done de mon SwingWorker. Y a t il plus performant que cette boucle qui ne fait rien (si ce n'est 600 millions de tests environ...) ?
    Merci d'avance
    [edit]Comment attendre efficacement la terminaison d'un traitement? : http://www.developpez.net/forums/sho...d.php?t=328490 [/edit]

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

Discussions similaires

  1. Texte dans une colonne qui déborde!
    Par pracede2005 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/11/2007, 22h11
  2. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03

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