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 :

[SWING][THREAD][JProgressBar][Graphics2D] c'est pas gagné !


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut [SWING][THREAD][JProgressBar][Graphics2D] c'est pas gagné !
    Bonjour a tous,

    Voila 5 heures que je cherche desesperemment a resoudre un probleme de JProgressBar et rien n'y fait !
    Pour faire simple :
    J'ai une fenetre splittée en 2, a gauche un boutton et une JProgressBar, a gauche un objet Graphics2D.
    Lorsque je clic que le boutton, je voudrais qu'il augmente le JProgressBar au fur et a mesure que les calculs pour le Graphics2D se font ...
    Donc j'ai un

    /*ActionListener*/
    public void actionPerformed (ActionEvent evt){
    Object source = evt.getSource();
    if (source == b1){
    pd.addGraphListener(this);

    /*Thread JProgressBar*/
    Thread runner = new Thread(new Runnable(){
    public void run(){
    refreshProgress(maBarre);
    }
    });
    runner.start();

    /*Graphics*/
    pd.repaint();
    pd.validate();
    }

    avec

    public void refreshProgress(JProgressBar jpb){

    for( int i = 0; i < 100; i++ ) {
    jpb.setValue(i);
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {e.printStackTrace();}
    }
    }


    Le probleme est le suivant, la JProgressBar se met UNIQUEMENT une fois que tout l'actionPerformed est terminé, et donc une fois que mon graph est fait ! !!! Pourtant l'utilisation du Thread me permet bien de faire les deux taches en parallele. Ce qui pose pb, c'est la rafraichissement de la fenetre ... j'ai l'impression que je n'ai pas la main que les objets swing de ma fenetre tant que l'actionPerformed tourne !

    J'ai egalement tenté les methodes invokeLater mais celle ci permette de passer en priorité l'objet runnable sur l'EDT ... or moi, je voudrais qu'il soit fait en simultané

    merci 1000 fois a ceux qui prendront le temps de m'aider !
    Nico

  2. #2
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    Ce truc va me rendre completement fou !
    J'ai essayé de lancer le paint() de mon objet dans un thread mais ca ne marche tjrs pas, j'ai l'impression que les actions sont quand meme empilées dans l'EDT, alors qu'elle devrait etre spécifique au thread lancé !
    Je pense que sur ce coup, je vais avoir besoin de qq'un d'expérimenté ...

    PS: j'ai fait une petite erreur dans mon message precedent, le boutton à gauche et le Graphics2D a droite, evidemment ;-)

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 908
    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 908
    Billets dans le blog
    54
    Par défaut
    Penser au

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    package test;
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.event.*;
     
    public class TestProgressBar extends JFrame implements ActionListener {
      private JProgressBar jpb;
      private JButton b1;
     
      public TestProgressBar() {
        super();
        jpb = new JProgressBar(0, 100);
        b1 = new JButton("Start");
        b1.addActionListener(this);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(b1);
        setLayout(new BorderLayout());
        add(buttonPanel, BorderLayout.WEST);
        add(jpb, BorderLayout.SOUTH);
      }
     
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            TestProgressBar dialog = new TestProgressBar();
            dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            dialog.setVisible(true);
            dialog.pack();
          }
        });
      }
     
      public void refreshProgress(JProgressBar jpb) {
        try {
          for (int i = 0; i < 100; i++) {
            jpb.setValue(i);
            jpb.repaint();
            Thread.sleep(100);
          }
        }
        catch (InterruptedException e) {
          e.printStackTrace();
        }
        finally {
          b1.setEnabled(true);
        }
      }
     
      /** {@inheritDoc}
       */
      public void actionPerformed(ActionEvent evt) {
        Object source = evt.getSource();
        if (source == b1) {
          b1.setEnabled(false);
          jpb.setValue(0);
          /*Thread JProgressBar*/
          Thread runner = new Thread(new Runnable() {
            /** {@inheritDoc}
             */
            public void run() {
              refreshProgress(jpb);
            }
          });
          runner.setPriority(Thread.NORM_PRIORITY);
          runner.start();
        }
      }
    }
    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

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    merci, mais ca ne resoud pas mon soucis !
    mais j'ai un peu avancé ... lorsque je lance mon thread pour ma JProgressBar, je suis obligé de faire appel a invokeLater pour que le refraichissement se fasse dans l'EDT. Le soucis c'est que la pile d'EDT contient deja tout ce qu'il y a dans mon paint() ! a savoir 55000 action fill et draw !

    Donc j'ai pensé a lancer le paint dans un autre thread, afin que celui-ci ne soit plus executer dans l'EDT ! Mais ca ne marche pas, si je fais :

    <code>
    public void actionPerformed (ActionEvent evt){
    Object source = evt.getSource();
    if (source == b1){
    Thread runner2=new Thread (new Runnable(){
    public void run(){
    pd.repaint();
    pd.validate();

    }
    });
    runner2.start();

    }

    </code>

  5. #5
    Membre éprouvé Avatar de White Rabbit
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 122

  6. #6
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    Bien, apres mure reflexion, je pense que c'est tout simplement impossible !!
    La raison est la suivante :
    Toute les opérations graphiques doivent passer par l'EDT !
    Donc utiliser une JProgressBar pour montrer l'avancement d'un long algo, pas de pb a condition que cet algorithme de touche pas à l'EDT !
    Dans mon cas, mon long traitement consiste a dessiner 55000 points sur un graph, et passe donc par l'EDT.
    Je me retrouve donc avec mon EDT dans lequel sont empilés à la fois le traitement de la JProgressBar, et mes 55000 draw ! Reste a voir si je peux jouer avec l'ordre d'empilement ...

    Peut-etre que je m'egart

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/08/2010, 11h29
  2. c'est pas gagné ;)
    Par arnofly dans le forum Vidéo
    Réponses: 3
    Dernier message: 28/01/2010, 12h21
  3. Réponses: 6
    Dernier message: 01/12/2009, 10h52
  4. Coordooné c'est pas gagné..
    Par corgato dans le forum Qt
    Réponses: 8
    Dernier message: 25/01/2008, 21h59
  5. [SWING] Ma table JTABLE n'est pas éditable
    Par Dahu dans le forum Composants
    Réponses: 7
    Dernier message: 06/04/2006, 11h22

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