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 :

JProgressBar + ralentir son execution


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    453
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 453
    Par défaut JProgressBar + ralentir son execution
    comment ralentir la progression d'un JProgressBar:
    * Y-a t-il une fonction en java comme sleep dans c qui permet q'attendre un laps du temps pour l'utiliser dans la progression du JProgrssBar

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JProgressBar pro= new JProgressBar();
    pro.setVaue(10);
    sleep(10); //c-a-d son alternative en java.
    pro.setValue(100);
    S'il y-a autre idée s'il vous plait n'hesitez pas a me guider (encore novice en java)

  2. #2
    Membre expérimenté

    Étudiant
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    Bonsoir,

    L'avancé de ta JProgressBar doit dépendre d'une tâche que tu exécute ! Pourquoi vouloir mettre un sleep ?

    Si tu en as vraiment besoin, regarde la Javadoc de la classe Thread.

  3. #3
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    SwingWorker
    Si tu n'as pas Java 6, une classe de SwingWorker est disponible chez Sun pour Java 1.4

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    De plus meme avec une instruction de repos entre les deux mises a jour de la barre, ce code donnerai toujours le meme resultat. Swing utilise une thread nommee EDT qui effectue alternativement la repeinture/le reaffichage de l'ecran et la propagation des evenement.

    En general, ce genre de code est execute au moment de la propagation des evenements, donc entre 2 reaffichages. Donc les changements de valeurs successifs passeront completement inapercus et seul le dernier sera pris en compte ; puisque l'affichage de la nouvelle valeur aura lieu APRES.

    Les solutions, sont de decouper une tache en petites etapes entres lesquelles on modifie les composants et on demande le reaffichage de l'interface. Cela peut etre mis en oeuvre :

    - pour les taches legeres qui peuvent etre executee durant l'EDT, par SwingUtilities.invokeLater() ou par un Timer Swing. On initialise la barre a son etat initial et on demande a l'EDT d'executer la tache PLUS TARD, en esperant qu'il y ai quelques cycles de reaffichage entre. Avec un Timer Swing il est possible de faire des taches cycliques de cette maniere.

    En gros, cela peut donner un truc du genre qui augmentera la barre toutes les 750ms et s'arretera a 100 (en supposant que la barre soit affichee immediatement a la fin du code) :
    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
     
    //Creation de la barre.
    final JProgressBar bar = ...
    //Ajout de la barre de l'interface.
    [...]
    // On execute la tache apres 750ms d'attente et ensuite repetition toutes les 750ms.
    final Timer timer = new Timer(750, new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        if (bar.getValue() == 100) {
          timer.stop();
        }
        bar.setValue(bar.getValue() + 10);
      }
    });
    timer.setRepeats(true);
    timer.start();
    - pour les taches lourdes (ex : acces a un fichier, une base de donnee ou gros calcul), il ne faut pas les executer lors de la propagation des evenements car sinon l'interface ne se rafraichit plus tant que le long traitement n'est pas fini et donc l'utilisateur pense que le programme est gele ou pire plante. Il faut donc deporter le travail dans une autre Thread.

    On peut le faire manuellement mais il faut alors faire tres attention quand on met a jour les composants Swing car il ne faut le faire que durant l'EDT (donc il va falloir utiliser SwingUtilities.invokeLater() ou SwingUtilities.invokeAndWait() sachant que cette derniere solution est bloquante mais peut mener a des deadlocks).

    D'ou l'interet de SwingWorker qui permet de faire ce genre de choses : le traitement de doInBackground() est effectue dans une autre Thread tandis que ceux de process() et done() sont fait durant l'EDT. Ainsi il est possible de mettre a jour la barre dans ces deux methodes ou alors d'utiliser setProgress() et de mettre a jour la barre en ecoutant la propriete "progress" du SwingWorker via un PropertyChangeListener.

    Je regrette cependant une interface d'utilisation un poil lourde et apparement il n'est pas possible de specifier la priorite ou le groupe de la thread dans laquelle la tache s'execute.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par bouye Voir le message
    Je regrette cependant une interface d'utilisation un poil lourde et apparement il n'est pas possible de specifier la priorite ou le groupe de la thread dans laquelle la tache s'execute.
    Pour ça il faut regarder du côté des ExecutorService

Discussions similaires

  1. expression reguliere et son execution
    Par mystro7200 dans le forum Général Java
    Réponses: 6
    Dernier message: 13/05/2009, 13h31
  2. Proteger son executable contre ResHacker ou autres..
    Par hepha1970 dans le forum Outils
    Réponses: 0
    Dernier message: 08/03/2009, 16h23
  3. criteria.list erst bloqué dans son execution
    Par *alexandre* dans le forum Hibernate
    Réponses: 3
    Dernier message: 10/09/2008, 19h03
  4. Réponses: 4
    Dernier message: 24/01/2007, 00h48
  5. Lors de son execution crontab
    Par fabszn dans le forum Administration système
    Réponses: 4
    Dernier message: 02/02/2006, 14h18

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