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

EDT/SwingWorker Java Discussion :

SwingWorker peut il être modal?


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut SwingWorker peut il être modal?
    Bonjour,

    Est-il possible de bloquer les actions utilisateurs sur une application lorsqu'un gros traitement (+affichage de barre de progression) est en cours dans un SwingWorker? J'ai bien tenté de rendre le JDialog, contenant la barre de progression, modal mais cela gèle l'avancement de la barre.
    De même j'ai essayé en créant un autre JDialog (hors et in SwingWorker) mais cela ne fonctionne pas non plus (hors => le traitement ne se lance pas tant que le jdialog n'est pas fermé, in => géle de la barre de progression).

    Merci.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Comment mets tu à jour ta barre de progression dans le SwingWorker?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Elle se faut dans une boucle for dans le doInBackground() avec un setProgress()

    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
     
    private int recalculStock(double progressStart, double progressEnd) {
      double step = (progressEnd - progressStart) / _listArticles.size();
      for (Article article:_listArticles){
        try {
          progressStart += step;
          publish(article.toString());
          article.setQteStock(article.getQteEnStock());
          ArticleIO.updateArticle(article);
          setProgress((int) progressStart);
        } catch (ControleurException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
      return _listArticles.size();
    }

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le setProgress ne met pas automatiquement à jour une JProgressBar.

    Il te faut ajouter un PropertyChangeListener à ton SwingWorker qui va écouter les modifications sur la property progress et les répercuter sur ta progressBar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    final JProgressBar progressBar = new JProgressBar(0, 100);
    PrimeNumbersTask task = new PrimeNumbersTask(textArea, N); 
    task.addPropertyChangeListener(      
       new PropertyChangeListener() {          
          public  void propertyChange(PropertyChangeEvent evt) {              
             if ("progress".equals(evt.getPropertyName())) {
                progressBar.setValue((Integer)evt.getNewValue());
             }
          }     
        }
    );

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Oui oui, il est est, j'ai oublié de le préciser
    Le problème de non mise à jour n'intervient que lorsque mon jdialog est modal.

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Fais voir le code dans lequel tu lances ton SwingWorker et tu attaches ton listener.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Voilà comment je lance mon SwingWorker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void onClickRecalculStock(){
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    /* Démarrage de l'interface graphique et du SwingWorker. */
                	barreProgressionSwingWorker BpSW = new barreProgressionSwingWorker(_lesArticlesIntrants);
                	barreProgressionSwingWorker.MonSwingWorker swingWorker = BpSW.new MonSwingWorker();
                    swingWorker.execute();
                }
            });
        }
    et pour mon listener rien de spécial

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public MonSwingWorker() {
    	            /* On ajoute un écouteur de barre de progression. */
    	            addPropertyChangeListener(new PropertyChangeListener() {
    	                public void propertyChange(PropertyChangeEvent evt) {
    	                    if("progress".equals(evt.getPropertyName())) {
    	                        progressBar.setValue((Integer) evt.getNewValue());
    	                        progressBar.setString ("Progression en cours " + ((Integer)evt.getNewValue()).toString() + "%");
    	                    }
    	                }
    	            });
    	        }

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Je suppose que ta méthode onClickRecalculStock est appelée depuis un listener, donc de fait s'exécute déjà dans l'EDT.
    Essaie donc de virer ton SwingUtilities.invokeLater qui englobe son contenu.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Je pensais que l'utilisation d'un SwingWorker se faisait toujours avec un SwingUtilities.invokeLater()
    Donc avec ce code, ce que je faisais c'était créer un nouveau thread pour la création de ma barre de défilement et au autre pour le traitement? J'ai bien compris?

    Sinon après la modification le résultat reste le même: aucun problème si ma JDialog n'est pas modal et freeze si elle l'est.

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Fais voire ton code complet. (JDialog+SwingWorker)

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    De retour après le week end

    L'appel de mon JDialog set fait ainsi via la méthode OnClickRecalculStock qui est appelée dans un listener.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void onClickRecalculStock(){
        barreProgressionSwingWorker BpSW = new barreProgressionSwingWorker(_lesArticlesIntrants);
        barreProgressionSwingWorker.MonSwingWorker swingWorker = BpSW.new MonSwingWorker();
        swingWorker.execute();
        }
    Mon Jdialog est une classe interne à la classe appelant onClickRecalculStock()
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    class barreProgressionSwingWorker extends JDialog {
        private static final long serialVersionUID = -6419612858688347140L;
        private JLabel labelText;
        private JProgressBar progressBar;
        private List<Article> _listArticles;
     
        public class MonSwingWorker extends SwingWorker<Integer, String> {
            public MonSwingWorker() {
                /* On ajoute un écouteur de barre de progression. */
                addPropertyChangeListener(new PropertyChangeListener() {
                    public void propertyChange(PropertyChangeEvent evt) {
                        if("progress".equals(evt.getPropertyName())) {
                            progressBar.setValue((Integer) evt.getNewValue());
    	                 progressBar.setString ("Progression en cours " + ((Integer)evt.getNewValue()).toString() + "%");
                        }
                    }
                });
            }
     
            @Override
            public Integer doInBackground() {
                return recalculStock(0, 100);
            }
     
            private int recalculStock(double progressStart, double progressEnd) {
                double step = (progressEnd - progressStart) / _listArticles.size();
                for (Article article:_listArticles){
                try {
                    progressStart += step;
                    publish(article.toString());
                    article.setQteStock(article.getCalculQteEnStock());
                    ArticleIO.updateArticle(article);
                    setProgress((int) progressStart);
    	     } catch (ControleurException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
    	     }
            }
     
            return _listArticles.size();
        }
     
        @Override
        protected void process(List<String> strings) {
            /* Affichage des publications reçues dans le textarea. */
            for(String s : strings)
                labelText.setText("Article en cours de traitement: " + s);
        }
     
        @Override
        protected void done() {
            /* Le traitement est terminé. */
            barreProgressionSwingWorker.this.dispose();
            JOptionPane.showMessageDialog(
            ViewInterface.getMainFrame(), 
            "Mise à jour des stocks effectuée avec succés.",
            "Information",
            JOptionPane.INFORMATION_MESSAGE);
        }
     
     
        public barreProgressionSwingWorker(List<Article> listArticles) {
            /* Construction de l'interface graphique. */
            super(ViewInterface.getMainFrame(), "Mise à jour stocks",false);
            Dimension dimension = new Dimension(350,80);
            this.setPreferredSize(dimension);
            this.setResizable(false);
            _listArticles = listArticles;
            setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
     
            labelText = new JLabel();
            labelText.setHorizontalAlignment(SwingConstants.CENTER);
     
            progressBar = new JProgressBar(0,99);
            progressBar.setStringPainted(true);
            progressBar.setString ("Progression 1%");
     
            JPanel content = new JPanel(new BorderLayout());
            content.add(labelText,BorderLayout.CENTER);
            JPanel south = new JPanel(new BorderLayout());
            south.add(progressBar);
            content.add(south, BorderLayout.SOUTH);
            setContentPane(content);
            pack();
            setVisible(true);
            Utils.centrer(this);
        }
    }
    Quelque chose de mauvais?

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/07/2006, 13h30
  2. Le nom d'une fenêtre peut-il être modifié dynamiquement ?
    Par jejerome dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/05/2006, 14h37
  3. Réponses: 10
    Dernier message: 20/02/2006, 17h04
  4. [GOF] Fabrique abstraite peut-elle être un Singleton ?
    Par manel007 dans le forum Design Patterns
    Réponses: 7
    Dernier message: 06/01/2005, 11h02
  5. Réponses: 6
    Dernier message: 03/09/2003, 11h29

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