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 :

Une classe JProgressBar réutilisable


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut Une classe JProgressBar réutilisable
    Bonjour,
    Je suis sur un problème depuis plusieurs jours, et après avoir essayer plusieurs méthodes qui marchent mais ne me satisfassent pas entièrement, je me tourne vers vous !
    Mon but : avoir une classe qui étends JFrame, qui contiennent une JProgressBar et un JTextArea et surtout, surtout, qui soit réutilisable !

    Ce que j'ai fait :
    - une classe qui créé ma Jframe et qui contient des méthodes de setTitle, setTxtAppend pour mettre à jour le JTxtArea, setProgress pour mettre à jour la JProgressBar ... etc.
    - une action (boucle) lancée depuis l'EDT qui met à jour la JProgressBar selon la méthode définie ci-dessus.

    Avant ce que je faisais, c'était un update(getGraphics) sur ma JFrame pour mettre à jour la progressbar, ce qui marchait très bien, jusqu' à ce que je m'aperçoive que ça me rallongeai considérablement mon temps de traitement.

    J'ai donc essayé le SwingWorker, qui est génial mais qui ne me sert à rien puisque de toute manière je dois attendre la fin de mon traitement pour continuer. J'ai essayé des SwingUtilities.invokelater dans tous les sens, même des invokenadwait, mais rien n'y fait : pas de mise à jour.

    En fait, j'obtiens ce que je veux en faisant un progressbar.update(progressbar.getGraphics) mais le résultat est un peu "sale" : la barre clignote et ce n'est pas beau du tout (évidemment car en fait dans ce cas j'update la barre à chaque itérations)

    Donc ce que je ne comprends pas, c'est que je mets bien à jour ma progressbar dans l'edt puisque j'y suis (test à l'appui ), mais la barre ne se mets pas à jour, et je suis obligé de passer par un update(getGraphics) soit de la barre, soit de la frame qui contient la barre ( d'ailleurs c'est idem pour le panel qui contient la barre ! où l JRootPane qui contient le panel qui contient ... bref, vous avez compris )

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    après avoir lancé votre SwingWorker ou votre invokeLater, vous devez sortir de votre action pour que l'update se fasse.

    Non seulement update(getGraphics()) est sale mais il est surtout garanti de ne pas fonctionner avec tous les Toolkits, getGraphics() peux retourner null ou un Graphics non prêt à l'affichage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    après avoir lancé votre SwingWorker ou votre invokeLater, vous devez sortir de votre action pour que l'update se fasse.
    Mais ce que je ne comprends pas, c'est d'une part pourquoi être obligé de faire un invokelater alors que je suis dans l'EDT, ce qui me rends mon processus complètement asynchrone de ma barre, et d'autre part, mon action est une boucle, donc si je sort de la boucle, je ne peux plus updater la barre ... à moins que j'aie mal compris ...
    Pourquoi avoir besoin de faire tout ça alors que je reste en séquentiel, dans l'EDT, donc ça ne devrait pas être si compliqué non ? c'est simplement dû au fait que je fais appel à une classe extérieure ?
    Peut être y a-t-il une façon plus simple de faire une progressbar un peu évoluée et réutilisable autre que dans une jframe, dans un dialog peut être ?
    Des idées ?
    Merci tchize

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour faire simple, tant que votre boucle squatte l'edt, celui-ci ne va plus lire les évènements de sa pile d'évènements. ceci aura les conséquence suivantes:

    1) plus aucun bouton votre application, plus aucun menu ne pourra réagir
    2) l'OS va voir que les pings dans la pile ne sont pas traité et va qualifier votre application de "ne répond pas"
    3) la fenetre ne se redessinera pas quand d'autre fenetre passeront au dessus, effet "rectangle gris".

    Le but est justement de forcer les opérations lourdes à avoir lieu "en dehors" de l'EDT. Mais les opération sur les composants, elles doivent avoir lieu dans l'EDT.

    C'est assez chiant à gérer, et SwingWorker est là pour ça

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    pour faire simple, tant que votre boucle squatte l'edt, celui-ci ne va plus lire les évènements de sa pile d'évènements. ceci aura les conséquence suivantes
    super, là j'ai très bien compris ... je crois !
    mais du coup, lorsque j'utilise swingworker, comme j'ai toute une suite de processus les uns à la suite des autres, du coup la mise à jour graphique, qui doit dépendre du résultat du premier processus, se fait plus vite que le processus lui même ! du coup j'avais cherché à synchroniser le swingworker et mon processus, ou alors à attendre que mon processus soit fini pour actualiser mes autres vues, mais sans succès ...

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    soit:

    tu envoie des informations via la méthode publish depuis "doInBackground'. SwingWorker va alors lancer dans l'EDT la méthode process() avec ces données, tu pourra y faire le nécessaire pour mettre à jour ton affichage.


    tu utilise la méthode simple "setProgress", swingworker invoquera alors les listener (ProgressListener) dans l'EDT, ce listener peuvent servir donc à mettre à jour l'affichage.

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

Discussions similaires

  1. [cls et Vbs]réutilisation d'une classe écrite dans un autre fichier
    Par EvaristeGaloisBis dans le forum VBScript
    Réponses: 0
    Dernier message: 20/02/2015, 15h03
  2. Réutilisation d'une classe CSS dans une autre
    Par Colbix dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 22/09/2007, 22h37
  3. [Juridique] Comment réutiliser le code source d'une classe ?
    Par mathieu dans le forum Général Java
    Réponses: 8
    Dernier message: 17/05/2004, 13h40
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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