Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème SWING - JProgressBar

    2 mai 2012 à 17:52:52

    Bonjour,

    Alors cela fait deux jours que je bloque sur un problème de JProgressBar, j'ai regardé beaucoup d'exemples sur l'API ou encore sur beaucoup de forums mais sans succès. Quand j'essaie leurs exemples seuls, ça fonctionne mais dès que je l'intègre à mon programme rien ne fonctionne.

    Alors pour faire simple, je veux faire une bar de progression dans une nouvelle fenêtre que celle en cours par le biais d'un SwingWorker. Or ça va pas ! La nouvelle fenêtre s'ouvre bien, mais elle est gélée dès qu'une partie de programme principal s'éxécute ...

    Je vais essayer de faire simple dans le code :

    /**
    *
    Programme principal ...
    *
    **/
    
    SwingWorker travail1 = new SwingWorker() {
    
    	@Override
    	protected Object doInBackground() throws Exception {
    		test_barre barre = new test_barre( );
    		return null;
    	}
    };
    travail1.run();
    
    /**
    Traitement qui gèle le SwingWorker ci dessus
    *
    *
    ***
    Suite du programme principal
    ***
    *
    **/
    


    Une chose qu'il faut savoir, c'est que le code ci-dessus correspond à une classe de mon projet, elle hérite de ActionListener, PropertyChangeListener, WindowListener. Donc je sais pas si le terme de programme principal est approprié ...

    N'hésitez pas à me dire si je ne suis pas clair sur certain point, je me rends pas forcément compte. Merci d'avance.

    Annexe :
    Code de test_barre ( trouvé sur internet ) :
    package vue;
    
    import java.awt.BorderLayout;
    import java.awt.Cursor;
    import java.awt.Insets;
    import java.awt.LayoutManager;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.util.List;
    import java.util.Random;
    
    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.SwingWorker;
    
    public class test_barre  {
    
    	public test_barre( ) {
    	    final JProgressBar progressBar = new JProgressBar(0, 10);
    
    	    final CounterTask task = new CounterTask();
    	    task.addPropertyChangeListener(new PropertyChangeListener() {
    	      public void propertyChange(PropertyChangeEvent evt) {
    	        if ("progress".equals(evt.getPropertyName())) {
    	          progressBar.setValue((Integer) evt.getNewValue());
    	        }
    	      }
    	    });
    	    JButton startButton = new JButton("Start");
    	    startButton.addActionListener(new ActionListener() {
    	      public void actionPerformed(ActionEvent e) {
    	        task.execute();
    	      }
    	    });
    
    	    JButton cancelButton = new JButton("Cancel");
    	    cancelButton.addActionListener(new ActionListener() {
    	      public void actionPerformed(ActionEvent e) {
    	        task.cancel(true);
    	      }
    	    });
    
    	    JPanel buttonPanel = new JPanel();
    	    buttonPanel.add(startButton);
    	    buttonPanel.add(cancelButton);
    
    	    JPanel cp = new JPanel();
    	    LayoutManager layout = new BoxLayout(cp, BoxLayout.Y_AXIS);
    	    cp.setLayout(layout);
    	    cp.add(buttonPanel);
    	    cp.add(progressBar);
    
    	    JFrame frame = new JFrame();
    	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    frame.setContentPane(cp);
    	    frame.pack();
    	    frame.setVisible(true);
    	  }
    	}
    
    	class CounterTask extends SwingWorker<Integer, Integer> {
    	  int DELAY = 1000;
    	  @Override
    	  protected Integer doInBackground() throws Exception {
    	    int i = 0;
    	    int count = 10;
    	    while (!isCancelled() && i < count) {
    	      i++;
    	      publish(new Integer[] { i });
    	      setProgress(count * i / count);
    	      Thread.sleep(DELAY);
    	    }
    	    return count;
    	  }   
    	  protected void process(List<Integer> chunks) {
    	      System.out.println(chunks);
    	  }
    	  @Override
    	  protected void done() {
    	    if (isCancelled())
    	      System.out.println("Cancelled !");
    	    else
    	      System.out.println("Done !");
    	  }
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      3 mai 2012 à 16:18:29

      Bon une solution bourrin qui marcherait à coup sûr serait évidemment de mettre ton code principal dans un thread... ou celui de ta barre de progression.

      Sinon, je crois qu'il faut de toute façon mettre le code de ton SwingWorker dans un Runnable comme ceci:
      SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                      
                      SwingWorker travail1 = new SwingWorker(){
      
      	            @Override
      	            protected Object doInBackground() throws Exception {
      		        test_barre barre = new test_barre();
      		        return null;
      	            }
                      };
                      
                      travail1 .execute();
                  }
      });
      
      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2012 à 19:33:27

        Est-ce que le SwingWorker va s’exécuter tout seul comme auparavant ? Ou il faut appeler le Runnable avec une méthode de SwingUtilities ?
        • Partager sur Facebook
        • Partager sur Twitter

        Problème SWING - JProgressBar

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown