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 :

Question sur le TaskMonitor de la JSR 296


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut Question sur le TaskMonitor de la JSR 296
    Bonjour à tous,

    Je me penche en ce moment sur la JSR 296 pour voir si elle me suffit pour ma future application. Pendant mes tests, j'ai remarqué une curieux comportement sur le taskmonitor.

    Pour tester le comportement, créez une basic desktop application dans Netbeans 6.
    Rajouter une Task qui ne fait qu'un parcours dans une boucle de 1 à 100 avec une pause.

    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 class DoNothingTask extends Task {
     
            @Override
            protected Object doInBackground() throws Exception {
                for (int i = 0; i < 100; i++) {
                    System.out.println("de " + this.getTitle() + " valeur de i : " + i);
                    Thread.sleep(120L);
                    this.setProgress(i);
                }
                return null;
            }
     
            public DoNothingTask(Application arg0, int count) {
                super(arg0);
                this.setTitle("une Tache "+count);
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       private int count=0;
        @Action
        public Task launchTask() {
            count+=1;
            return new DoNothingTask(Application.getInstance(), count);
        }
    Dans le constructeur de la frameView rajoutez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
            taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
     
                public void propertyChange(PropertyChangeEvent evt) {
                    System.out.println("eventDispatch?"+SwingUtilities.isEventDispatchThread());
                    System.err.println("Evenment : "+evt.getPropertyName());
                }
            });
    Rajouter un bouton pour lancer la DonothingTask.

    Lancez l'application, cliquez plusieurs fois sur le bouton. Il y a donc autant de tâches qui sont lancées. Si vous regardez dans la sortie vous verrez que la méthode propertyChange n'est pas toujours appelé quand il le faut.

    Précision de la javadoc :
    This class is not thread-safe. All of its methods must be called on the event dispatching thread (EDT) and all of its listeners will run on the EDT.
    D'ailleurs la progresse bar et la busyicon ne changent plus dans ces moments là.

    Vu le comportement que j'observe, j'hésite à faire un rapport de bug.
    Qu'en pensez-vous? Est-ce que j'utilise mal la classe taskMonitor ou y a t'il un vrai problème?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Tout d'abord, je crois que tu utilises mal la conception : la progressbar devrait idéalement afficher une seule tâche.

    Alors ce que je te conseille, c'est de
    1) te limiter à une tâche en même temps, c-à-d bloquer le bouton pour n'effectuer qu'une seule tâche (ou changer le bouton pour interrompre la tâche) ;
    2) ou créer une tâche-mère qui gèrera toutes les tâches enfants (chaque tâche enfant étant créée par un clic sur le bouton, et la tâche-mère étant créée lors du premier clic).

    Ensuite, pour quand même répondre à ton problème, vu que les listeners sont faits dans l'EDT, ET que donc tu effectues des Thread.sleep() dans l'EDT, tu bloques l'EDT, ce qui est extrêmement mauvais !

    Pour pallier à cela, tu dois créer un nouveau Thread dans ta méthode doInBackground(). Ce Thread fera alors exactement ce que tu désires, et débloquera ton EDT, ce qui raffraîchira ton application.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Tout d'abord, je crois que tu utilises mal la conception : la progressbar devrait idéalement afficher une seule tâche.

    Alors ce que je te conseille, c'est de
    1) te limiter à une tâche en même temps, c-à-d bloquer le bouton pour n'effectuer qu'une seule tâche (ou changer le bouton pour interrompre la tâche) ;
    2) ou créer une tâche-mère qui gèrera toutes les tâches enfants (chaque tâche enfant étant créée par un clic sur le bouton, et la tâche-mère étant créée lors du premier clic).

    Ensuite, pour quand même répondre à ton problème, vu que les listeners sont faits dans l'EDT, ET que donc tu effectues des Thread.sleep() dans l'EDT, tu bloques l'EDT, ce qui est extrêmement mauvais !

    Pour pallier à cela, tu dois créer un nouveau Thread dans ta méthode doInBackground(). Ce Thread fera alors exactement ce que tu désires, et débloquera ton EDT, ce qui raffraîchira ton application.
    Merci de ta réponse dingoth.

    La conception général n'est pas de moi et surtout la partie ajout de listener et de création de task, elle est issue d'un template de nebteans.(basic desktop application) qui utilise une nouveau framework swing qui sera intégré à terme dans java 7.

    L'ensemble fonctionne bien avec quelques threads.

    Normalement, il n'est pas nécessaire de créer un nouveau Thread dans doInBackgroups. La classe Task hérite de swingworker, cette partie s'exécute dans un thread séparé. Preuve en est, je peux cliquer autant de fois que je veux sur mon bouton pour lancer de nouveau thread, et le reste de mon IHM répond toujours bien.

    informations complémentaires

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Je connais bien le appframework, je l'utilise au quotidien. Mais ce que tu proposes est effectivement un cas particulier. Je me suis laissé emporter par le lundi matin dans ma réponse : tu ne fais effectivement pas le doInBackgrounds() dans l'EDT. Désolé.

    Je me réfère donc maintenant à SwingWorker : la méthode publish() appelée par setProgress() (de Task) crée un buffer d'objets à envoyer à process(). Elle peut donc avoir un comportement peu judicieux en bufferisant plusieurs setProgress() sans pour autant les répercuter (tant dans la JProgressBar que dans la console), malgré les 120ms d'attente pour chaque Thread.

    Pour la conception, je parle de ta manière de voir les choses. Typiquement, une barre de progression équivaut à une tâche. Dans le cas de plusieurs tâches, je crois qu'il faut être logique, et utiliser la barre de progression pour traiter l'avancement de l'ensemble des tâches et non une barre des tâches qui changerait de 90% à 10% puis à 45%, etc.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    Oublions la barre de progression. Je reviendrais dessus lorsque j'aurais bien compris le taskmonitor.

    Ce dernier, si j'ai bien compris, permet de monitorer les tasks qui sont lancées.
    On peut donc écouter les changements d'état des tâches en cours d'exécution.
    et récupérer à tous moment l'ensemble des taches en cours.

    les listener reçoivent la notification de changement de la tâche qui est en train de travailler (la foregroundTask). Donc logiquement, je peux avoir un listener qui me sorte les changements d'état avec un println, mais voilà au bout de quelques taches, je ne reçoit plus aucune notification. Les tâches, elles continuent de fonctionner.

    C'est dernière partie là que je ne comprends pas. Avec 4 taches de lancée, pas de soucis au niveau du listener, au-delà je n'ai plus rien au bout de quelques minutes d'éxécution.

    Merci de m'éclairer de ta lanterne.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Copie/colle un peu le code intéressant de ton application de test, stp... C-à-d la classe étendant SingleFrameApplication : je n'ai pas NetBeans, mais Eclipse. Je n'ai donc pas le même template. Si tu as fais plusieurs fichiers, copie/colle les autres classes intéressantes.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Bon, j'ai reproduit approximativement le code. Et je n'ai qu'un seul problème : seules trois tâches sont lancées simultanément. La quatrième (tout comme celles qui suivent) est mise en queue. Je ne comprends pas l'erreur. Les événements, par contre, sont correctement gérés.

    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
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.beans.PropertyChangeEvent;
     
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.SwingUtilities;
     
    import org.jdesktop.application.Action;
    import org.jdesktop.application.Application;
    import org.jdesktop.application.SingleFrameApplication;
    import org.jdesktop.application.Task;
     
    public class AppFrameWorkTest
    		extends SingleFrameApplication {
     
    	private int count = 0;
    	@Action
    	public Task clic() {
    		return new DoNothingTask(this, count++);
    	}
     
    	@Override
    	protected void startup() {
    		getContext().getTaskMonitor().addPropertyChangeListener(new java.beans.PropertyChangeListener() {
                 public void propertyChange(PropertyChangeEvent evt) {
                    System.out.println("eventDispatch?"+SwingUtilities.isEventDispatchThread());
                    System.err.println("Evenment : "+evt.getPropertyName());
                }
            });
    		show(createMainPanel());
    	}
     
    	private JComponent createMainPanel() {
    		JPanel panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    //		panel.add(new JProgressBar(), BorderLayout.SOUTH);
    		panel.add(new JButton(getContext().getActionManager().getActionMap().get("clic")), BorderLayout.CENTER);
    		panel.setPreferredSize(new Dimension(100, 100));
    		return panel;
    	}
     
    	public static void main(String... args) {
    		launch(AppFrameWorkTest.class, args);
    	}
     
    	private class DoNothingTask
    			extends Task<Object, Integer> {
    		@Override
    		protected Object doInBackground()
    				throws Exception {
    			for (int i = 0; i < 100; i++) {
    				System.out.println("de " + this.getTitle() + " valeur de i : "
    						+ i);
    				Thread.sleep(120L);
    				this.setProgress(i);
    			}
    			return null;
    		}
    		public DoNothingTask(Application arg0, int count) {
    			super(arg0);
    			this.setTitle("une Tache " + count);
    		}
    	}
    }

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    Je n'ai pas d'erreur à proprement parler.

    Mais si les taches sont bien mises en queue (3 en cours d'exécution comme toi), il suffit que j'en ai une petite dizaine pour que je n'ai plus les notifications. Cela se passe surtout après que les 3ières tâches soient finies.

    Juste pour information, tu as testé avec quelle version du framework? J'ai utilisé celle livrée avec netbeans (cela doit être la 1.0.3).

    Merci de ton temps passé sur mon problème.

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    J'utilise la version 1.0.3. La seule différence avec Netbeans, je crois, est le nom du package. Rien d'important, donc.

    J'ai mis une cinquantaine de tâche en queue. Effectivement, la sortie ERR se montre plus "Evenment : progress" (les autres sont ok) passé 3 tâches accomplies et jusqu'à 3 tâches avant la fin. L'événement passant malgré tout, je suppose que le problème vient d'Eclipse et de sa redirection des stdin et stdout (ce doit être pareil pour Netbeans). Mais bon, je ne vois pas le blocage à proprement parler : j'ai pas placé de barre, ni d'icône.

    Copie/colle malgré tout ton code ici. Peut-être as-tu quelque chose de spécifique que je n'ai pas écrit.

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    Ok,
    Je le ferais ce soir (dés que j'aurais accès à mon NB).

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    reBonsoir,

    voici le code de ma frame de test.

    J'ai testé ton code, et il a le même problème. Les notifications ne sont plus envoyés aux listeners. Ce qui est assez dérangeant si on veut informer l'utilisateur de l'avancer des travaux.


    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    /*
     * DesktopApplication1View.java
     */
    package desktopapplication1;
     
    import java.beans.PropertyChangeEvent;
    import org.jdesktop.application.Action;
    import org.jdesktop.application.Application;
    import org.jdesktop.application.ResourceMap;
    import org.jdesktop.application.SingleFrameApplication;
    import org.jdesktop.application.FrameView;
    import org.jdesktop.application.TaskMonitor;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.Timer;
    import javax.swing.Icon;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import org.jdesktop.application.Task;
     
    /**
     * The application's main frame.
     */
    public class DesktopApplication1View extends FrameView {
     
        public DesktopApplication1View(SingleFrameApplication app) {
            super(app);
     
            initComponents();
     
            // status bar initialization - message timeout, idle icon and busy animation, etc
            ResourceMap resourceMap = getResourceMap();
            int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
            messageTimer = new Timer(messageTimeout, new ActionListener() {
     
                public void actionPerformed(ActionEvent e) {
                    statusMessageLabel.setText("");
                }
            });
            messageTimer.setRepeats(false);
            int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
            for (int i = 0; i < busyIcons.length; i++) {
                busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
            }
            busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
     
                public void actionPerformed(ActionEvent e) {
                    busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                    statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
                }
            });
            idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
            statusAnimationLabel.setIcon(idleIcon);
            progressBar.setVisible(false);
     
            // connecting action tasks to status bar via TaskMonitor
            TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
            taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
     
                public void propertyChange(PropertyChangeEvent evt) {
                    System.out.println("eventDispatch?"+SwingUtilities.isEventDispatchThread());
                    System.err.println("Evenment : "+evt.getPropertyName());
                }
            });
        }
     
        @Action
        public void showAboutBox() {
            if (aboutBox == null) {
                JFrame mainFrame = DesktopApplication1.getApplication().getMainFrame();
                aboutBox = new DesktopApplication1AboutBox(mainFrame);
                aboutBox.setLocationRelativeTo(mainFrame);
            }
            DesktopApplication1.getApplication().show(aboutBox);
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
     
            mainPanel = new javax.swing.JPanel();
            jButton1 = new javax.swing.JButton();
            jLabel1 = new javax.swing.JLabel();
            menuBar = new javax.swing.JMenuBar();
            javax.swing.JMenu fileMenu = new javax.swing.JMenu();
            javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
            javax.swing.JMenu helpMenu = new javax.swing.JMenu();
            javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
            statusPanel = new javax.swing.JPanel();
            javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
            statusMessageLabel = new javax.swing.JLabel();
            statusAnimationLabel = new javax.swing.JLabel();
            progressBar = new javax.swing.JProgressBar();
     
            mainPanel.setName("mainPanel"); // NOI18N
     
            javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(desktopapplication1.DesktopApplication1.class).getContext().getActionMap(DesktopApplication1View.class, this);
            jButton1.setAction(actionMap.get("launchTask")); // NOI18N
            jButton1.setName("jButton1"); // NOI18N
     
            org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopapplication1.DesktopApplication1.class).getContext().getResourceMap(DesktopApplication1View.class);
            jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
            jLabel1.setName("jLabel1"); // NOI18N
     
            javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
            mainPanel.setLayout(mainPanelLayout);
            mainPanelLayout.setHorizontalGroup(
                mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(mainPanelLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 254, Short.MAX_VALUE)
                        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap())
            );
            mainPanelLayout.setVerticalGroup(
                mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(mainPanelLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
                    .addContainerGap())
            );
     
            menuBar.setName("menuBar"); // NOI18N
     
            fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
            fileMenu.setName("fileMenu"); // NOI18N
     
            exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
            exitMenuItem.setName("exitMenuItem"); // NOI18N
            fileMenu.add(exitMenuItem);
     
            menuBar.add(fileMenu);
     
            helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
            helpMenu.setName("helpMenu"); // NOI18N
     
            aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
            aboutMenuItem.setName("aboutMenuItem"); // NOI18N
            helpMenu.add(aboutMenuItem);
     
            menuBar.add(helpMenu);
     
            statusPanel.setName("statusPanel"); // NOI18N
     
            statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N
     
            statusMessageLabel.setName("statusMessageLabel"); // NOI18N
     
            statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
            statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N
     
            progressBar.setName("progressBar"); // NOI18N
     
            javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
            statusPanel.setLayout(statusPanelLayout);
            statusPanelLayout.setHorizontalGroup(
                statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE)
                .addGroup(statusPanelLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(statusMessageLabel)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 104, Short.MAX_VALUE)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(statusAnimationLabel)
                    .addContainerGap())
            );
            statusPanelLayout.setVerticalGroup(
                statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(statusPanelLayout.createSequentialGroup()
                    .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(statusMessageLabel)
                        .addComponent(statusAnimationLabel)
                        .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(3, 3, 3))
            );
     
            setComponent(mainPanel);
            setMenuBar(menuBar);
            setStatusBar(statusPanel);
        }// </editor-fold>                        
     
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JPanel mainPanel;
        private javax.swing.JMenuBar menuBar;
        private javax.swing.JProgressBar progressBar;
        private javax.swing.JLabel statusAnimationLabel;
        private javax.swing.JLabel statusMessageLabel;
        private javax.swing.JPanel statusPanel;
        // End of variables declaration                   
        private final Timer messageTimer;
        private final Timer busyIconTimer;
        private final Icon idleIcon;
        private final Icon[] busyIcons = new Icon[15];
        private int busyIconIndex = 0;
        private JDialog aboutBox;
        private int count=0;
        @Action
        public Task launchTask() {
            count+=1;
            return new DoNothingTask(Application.getInstance(), count);
        }
     
        private class DoNothingTask extends Task {
     
            @Override
            protected Object doInBackground() throws Exception {
                for (int i = 0; i < 100; i++) {
                    System.out.println("de " + this.getTitle() + " valeur de i : " + i);
                    Thread.sleep(120L);
                    this.setProgress(i);
                }
                return null;
            }
     
            public DoNothingTask(Application arg0, int count) {
                super(arg0);
                this.setTitle("une Tache "+count);
            }
        }
    }

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Je ne vois pas alors. Je crois que tu devrais poster le problème sur le site d'appframework.

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Je ne vois pas alors. Je crois que tu devrais poster le problème sur le site d'appframework.
    C'est ce que je vais faire. Merci de ton aide. Je posterai afin de vous tenir au courant.

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 22h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 22h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 09h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 22h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 17h11

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