Accueil de l'archive Service proposé par Hervé AGNOUX

TOUT -|- TOUT sur le visuel -|- TOUT sur la logistique

From:           	Erik Mazoyer <erik.mazoyer@hyperoffice.fr>
To:             	java@u-strasbg.fr
Subject:        	[Swing][Thread][invokeLater]
Date sent:      	Fri, 23 Feb 2001 19:09:19 +0100
Send reply to:  	java@u-strasbg.fr

Swing me fait valser !

Mon problème est assez simple :

J'ai un bouton (JButton) qui déclenche une tache longue.
1) Pendant cette tache, la fenetre contenant le bouton doit être bloquée
(c'est à dire que le click ne doivent pas être pris en compte) 2) La tache
étant longue, je voudrais afficher un dialogue indiquant que la tache est
en cours

Pour faire cela, j'ai écris :

  monBoutton.addActionListener(new
java.awt.event.ActionListener() {
   public void actionPerformed(ActionEvent e) {
    try {
     Runnable r = new Runnable() {
      public void run() {
       doSomething();
      }
     };
     SwingUtilities.invokeLater(r);
    } catch (Throwable th) {

     th.printStackTrace();
    }
   }
  });

Dans la méthode doSomething() j'appelle startWaitingMessage et
endWaitingMessage .

public void startWaitingMessage(String message) {
 if(m_WaitMessageDialog == null) {
  m_WaitMessageDialog = new WaitMessageDialog(this,"Task
running...",message);
 }
 m_WaitMessageDialog.show();
}

public void endWaitingMessage() {
 m_WaitMessageDialog.hide();
}

WaitMessageDialog est un dialogue non modal.

Conclusion :

Le dialogue apparait mais gris !
Par contre le actions sur la fenètre sont bien non pris en compte.

Il semble que Swing n'ai jamais le temps de le rafraichir.

Pourtant, pour SwingUtilities.invokeLater(r), il est dit :
Causes doRun.run() to be executed asynchronously on the AWT event
dispatching thread.

Le fait de désynchronisé devrait laisser du temps à Swing ?

Quelle est votre solution ?


--------------------------------------------------------------------
Erik Mazoyer, Chef de projet
HyperOffice
6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
Tél. 01 41 96 96 76
Fax 01 41 96 96 77
Mél  erik.mazoyer@hyperoffice.fr 

     

Date sent:      	Mon, 26 Feb 2001 08:51:48 +0100
To:             	java@u-strasbg.fr
From:           	Stéphane PIEL <stephane.piel@softeam.fr>
Subject:        	Re: [Swing][Thread][invokeLater]
Send reply to:  	java@u-strasbg.fr

Ton problème vient du fait que tu n'utilises pas de Thread.
Quand le actionPerformed associé à monBouton est exécuté, il l'est dans le
thread de gestion des évenements AWT. C'est dans ce thread que sont
exécutés tous les évenements de rafraichissement de l'interface. En
utilisant invokeLater, ce que tu fais, c'est de reporter dans le temps
l'éxécution du code associé. Mais celui-ci sera quand même exécuté dans le
thread AWT, lorsqu'il ne restera plus aucun évenement en attente. Ce qui
explique ta boite de dialogue qui s'affiche 'tout en gris', vu qu'entre le
moment ou elle est affichée et celui ou elle est fermée, la main n'est
jamais rendu au thread de gestion des évenements AWT (exécution de la
tâche longue) et l'affichage ne peut être rafraichi.

Ce qu'il te faut ici, c'est lancer un thread. En gros, il te faut
remplacer l'appel à
         SwingUtilities.invokeLater(r);
par un
         new Thread(r).start();
Et là, la boite de dialogue doit s'afficher normalement. Par contre, étant
non modale, elle ne bloquera pas les actions sur la fenetre principale. Il
te faut plutot utiliser une boite modale. Dans ce cas, l'affichage de la
boite de dialogue ne doit plus être fait dans la méthode doSomething, mais
juste après le lancement du thread. Ca devrait résoudre ton problème.


-- 
Stephane PIEL - SOFTEAM Ouest - Agence de Rennes
mailto:stephane.piel@softeam.fr

-- 
Exceptionnel !  Votre atelier UML Professionnel GRATUIT !
Telechargez le depuis notre site http://www.objecteering.com

SOFTEAM
------- Think Object


     

Date sent:      	Mon, 26 Feb 2001 09:14:08 +0100
From:           	Joel Landure <jlandure@shom.fr>
To:             	java@u-strasbg.fr
Subject:        	Re: [Swing][Thread][invokeLater]
Send reply to:  	java@u-strasbg.fr

Essais la méthode invokeLater(myRunner) de la classe java.awt.EventQueue
qui oblige la méthode run de l'objet myRunner à s'exécuter dans le thread
de répartrition des évènements. Cette classe gère des détails de la
synchronisation. Cette méthode est disponible aussi dans SwingUtilies avec
le jdk 1.1 mais ajoutée à EventQueue depuis le jdk1.2

Ex :
EventQueue.invokeLater( new runnable()
{  public void run() { myLabel.setText(("Execution : " + thePercentage +
"%") ; } }

Erik Mazoyer wrote:
> 
> Swing me fait valser !
> 
> Mon problème est assez simple :
> 
> J'ai un bouton (JButton) qui déclenche une tache longue.
> 1) Pendant cette tache, la fenetre contenant le bouton doit être bloquée
> (c'est à dire que le click ne doivent pas être pris en compte) 2) La
> tache étant longue, je voudrais afficher un dialogue indiquant que la
> tache est en cours
> 
> Pour faire cela, j'ai écris :
> 
>                 monBoutton.addActionListener(new
> java.awt.event.ActionListener() {
>                         public void actionPerformed(ActionEvent e) {
>                                 try {
>                                     Runnable r = new Runnable() {
>                                     public void run() {
>                                     doSomething();
>                                     }
>                                     };
>                                     SwingUtilities.invokeLater(r);
>                                 } catch (Throwable th) {
> 
>                                     th.printStackTrace();
>                                 }
>                         }
>                 });
> 
> Dans la méthode doSomething() j'appelle startWaitingMessage et
> endWaitingMessage .
> 
> public void startWaitingMessage(String message) {
>         if(m_WaitMessageDialog == null) {
>                 m_WaitMessageDialog = new WaitMessageDialog(this,"Task
> running...",message);
>         }
>         m_WaitMessageDialog.show();
> }
> 
> public void endWaitingMessage() {
>         m_WaitMessageDialog.hide();
> }
> 
> WaitMessageDialog est un dialogue non modal.
> 
> Conclusion :
> 
> Le dialogue apparait mais gris !
> Par contre le actions sur la fenètre sont bien non pris en compte.
> 
> Il semble que Swing n'ai jamais le temps de le rafraichir.
> 
> Pourtant, pour SwingUtilities.invokeLater(r), il est dit :
> Causes doRun.run() to be executed asynchronously on the AWT event
> dispatching thread.
> 
> Le fait de désynchronisé devrait laisser du temps à Swing ?
> 
> Quelle est votre solution ?
> 
> --------------------------------------------------------------------
> Erik Mazoyer, Chef de projet HyperOffice 6, rue Jacques Daguerre - 92565
> Rueil-Malmaison Cedex Tél. 01 41 96 96 76 Fax 01 41 96 96 77 Mél 
> erik.mazoyer@hyperoffice.fr


C'est fini ! Retour à l'accueil de la pseudo-archive