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] Boucle obligatoire dans le doInBackground() ?


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 47
    Par défaut [SwingWorker] Boucle obligatoire dans le doInBackground() ?
    Bonjour,

    J'essaye de comprendre un peu le fonctionnement d'une tache héritant de SwingWorker et une chose me tracasse, si l'on enlève la boucle while dans le doInBackground de l'exemple compilable ci dessous alors un seul des 7 publish() semble se produire..

    Pourquoi ?

    Merci de votre aide.


    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
     
     * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
     
     
     
    import java.util.List;
     
    @SuppressWarnings("serial")
    public class Flipper extends JFrame implements ActionListener {
     
    	private final GridBagConstraints constraints;
        private final JTextField headsText, totalText;
        private final Border border = BorderFactory.createLoweredBevelBorder();
        private final JButton startButton, stopButton;
        private FlipTask flipTask;
     
        private JTextField makeText() {
     
        	JTextField t = new JTextField(20);
            t.setEditable(false);
            t.setHorizontalAlignment(JTextField.RIGHT);
            t.setBorder(border);
            getContentPane().add(t, constraints);
            return t;
        }
     
        private JButton makeButton(String caption) {
     
        	JButton b = new JButton(caption);
            b.setActionCommand(caption);
            b.addActionListener(this);
            getContentPane().add(b, constraints);
            return b;
        }
     
        public Flipper() {
     
        	super("Flipper");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Make text boxes
            getContentPane().setLayout(new GridBagLayout());
            constraints = new GridBagConstraints();
            constraints.insets = new Insets(3, 10, 3, 10);
            headsText = makeText();
            totalText = makeText();
     
            //Make buttons
            startButton = makeButton("Start");
            stopButton = makeButton("Stop");
            stopButton.setEnabled(false);
     
            //Display the window.
            pack();
            setVisible(true);
        }
     
     
        private class FlipTask extends SwingWorker<Void, String> {
     
        	@Override
            protected Void doInBackground() {
     
                while(!isCancelled()){
                    publish(new Random().toString());
                    publish(new Random().toString());
                    publish(new Random().toString());
                    publish(new Random().toString());
                    publish(new Random().toString());
                    publish(new Random().toString());
                    publish(new Random().toString());
     
                }
    			return null;
            }
     
            protected void process(List<String> pairs) {
            	System.out.println("process");
            	String pair = pairs.get(pairs.size() - 1);
                headsText.setText(pair);
                totalText.setText(String.valueOf(pairs.size()));       
            }
        }
     
     
     
        public void actionPerformed(ActionEvent e) {
     
        	if ("Start" == e.getActionCommand()) {
                startButton.setEnabled(false);
                stopButton.setEnabled(true);
                (flipTask = new FlipTask()).execute();
            } else if ("Stop" == e.getActionCommand()) {
                startButton.setEnabled(true);
                stopButton.setEnabled(false);
                flipTask.cancel(true);
                flipTask = null;
            }
     
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new Flipper();
                }
            });
        }
    }

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Un appel à publish() n'implique pas forcément associé à un appel à process(). Pour des raisons de performances plusieurs appels à publish() peuvent être regroupé en un seul appel à process(), qui contiendra alors toutes les données regroupé dans la List...




    Au passage attention à ceci qui n'est pas forcément vrai dans tous les cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ("Start" == e.getActionCommand()) {
    Les objets se comparent avec la méthode equals() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ("Start".equals(e.getActionCommand())) {

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 47
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Un appel à publish() n'implique pas forcément associé à un appel à process(). Pour des raisons de performances plusieurs appels à publish() peuvent être regroupé en un seul appel à process(), qui contiendra alors toutes les données regroupé dans la List...
    Ok, donc finalement, le problème dans cette exemple, c'est que le process() n'affiche pas toute la liste!

    Citation Envoyé par adiGuba Voir le message

    Au passage attention à ceci qui n'est pas forcément vrai dans tous les cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ("Start" == e.getActionCommand()) {
    Les objets se comparent avec la méthode equals() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ("Start".equals(e.getActionCommand())) {
    Merci du conseil et bravo Sun pour l'erreur puisque l'exemple vient de chez eux..

    J'ai une autre question :

    Comment enchainer a la suite du lancement d'une tache mais en étant sure qu'elle est terminée?


    Merci pour votre aide.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    Une bonne partie des didacticiels les plus anciens disponibles chez Sun (de meme que certaines parties du code source de l'API en fait) ne sont pas des parangon de bonne pratiques de programmation.
    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

Discussions similaires

  1. Boucle For dans un TDBGrid
    Par Latipolia dans le forum C++Builder
    Réponses: 28
    Dernier message: 14/06/2005, 13h12
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 13h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 09h34
  4. boucle for dans un if...
    Par SylverFox dans le forum Débuter
    Réponses: 3
    Dernier message: 11/08/2004, 17h57
  5. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 17h07

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