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

AWT/Swing Java Discussion :

Afficher un message d'attente


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Afficher un message d'attente
    Bonjour à tous,

    Je suis en train de faire une bête application graphique avec Swing. Certaines opérations durent quelques secondes et je voudrais afficher un message d'attente à l'utilisateur tout en "gelant" la souris.

    Voici le code appelant le traitement un peu long.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void actionPerformed(ActionEvent e) {
                        mouseBusy("Processus en cours...");
                        site.getCurrentChapter().resizeAllImages(Constants.IMAGE_HEIGHT); // processus long
                        mouseFree();
                    }
    puis le code de la méthode sensée afficher le message d'attente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void mouseBusy (String text) {
             txaLog.setText(text);
               txaLog.setVisible(true);
               jFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        }
    Le "gel" de la souris (jFrame.setCursor) a bien lieu (j'ai le sablier) mais l'affichage du message n'a pas lieu. Il n'est visible qu'après l'exécution du processus long. Pourquoi ?

    Merci de votre aide.

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Salut,

    Le texte ne s'affiche pas car l'EDT est occupé. Tu effectues ton traitement long dans le thread qui s'occupe de l'affichage, ce qui n'est pas correct car empêche les composants de se dessiner (si pendant ton traitement long tu réduis et réouvre ta fenêtre, il y a de fortes chances pour que tu ais une fenêtre blanche).

    Tu peux faire attendre l'utilisateur en bloquant tous les événements souris et clavier grâce à l'utilisation d'un glass pane.

    Un élément de réponse :
    http://gfx.developpez.com/tutoriel/java/swing/wait/

    ++
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour cette réponse. Si je comprends bien je n'ai absolument pas d'autre alternative que d'exécuter mon traitement long dans un autre thread ? Comme je ne suis pas un programmeur pro en java et que l'appli n'a qu'un but personnel j'aurais aimé éviter le multithreading. Mais bon, après tout faut bien apprendre !!

    Ce que je voulais faire c'était simplement :
    1) Afficher message d'attente + geler la souris.
    2) Exécuter traitement long
    3) Enlever message d'attente + dégeler la souris.

    C'est pas très classieux mais à priori facile à programmer. Je ne comprends pas bien pourquoi 2) s'exécute avant 1) (mon code demande bien explicitement l'affichage du message avant le processus long). Est-ce à cause de l'invokeLater au lancement de l'appli (généré automatiquement par turbo JBuilder) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public static void main(String[] args) {
          // TODO Raccord de méthode auto-généré
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    CV3 application = new CV3();
                    application.getJFrame().setVisible(true);
                    application.initialize();
                }
            });
        }
    En attendant je vais potasser la FAQ Swing "Pourquoi ma barre d'attente se remplit d'un coup ?" et compiler ça avec le lien que tu m'as donné. Ce sera effectivement plus classe !!

    Merci encore.

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par sjavlord Voir le message
    1) Afficher message d'attente + geler la souris.
    2) Exécuter traitement long
    3) Enlever message d'attente + dégeler la souris.

    Je ne comprends pas bien pourquoi 2) s'exécute avant 1) (mon code demande bien explicitement l'affichage du message avant le processus long).
    Voici ce qu'il se passe vulgairement :

    1. Mettre en place message d'attente => demande de repaint 1 !
    2. Exécuter traitement long
    3. Enlever message d'attente => demande de repaint 2 !
    4. Repaint 1
    5. Repaint 2


    Tu peux mettre ton traitement long et ton mouseFree dans un bloc SwingUtilities.invokeLater(...) comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void actionPerformed(ActionEvent e) {
        mouseBusy("Processus en cours...");
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                site.getCurrentChapter().resizeAllImages(Constants.IMAGE_HEIGHT);
                mouseFree();
            }
        });
    }
    et tu auras :

    1. Mettre en place message d'attente => demande de repaint 1 !
    2. Repaint 1
    3. Exécuter traitement long
    4. Enlever message d'attente => demande de repaint 2 !
    5. Repaint 2


    Mais c'est pas propre car tu figes ton appli et les utilisateurs ils aiment pas trop ça, si ça dure trop longtemps ils ont même tendance à killer l'applic... Le minimum serait d'afficher une progress barre s'incrémentant à chaque image redimensionnée.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ok. Merci Natha, cette fois ça répond complètement à ma question. Le bout de code que tu proposes fonctionne parfaitement. Je vais l'utiliser pour parer au plus pressé mais j'ai bien pris note de tes remarques et je vais étudier plus précisément le fonctionnement de swing, l'EDT et tutti quanti pour faire quelque chose de propre. Je me permet de réorienter tout lecteur vers ce tutorial qui complète celui déjà proposé :

    http://gfx.developpez.com/tutoriel/j...ing-threading/

    J'espère que cette petite discussion éclairera quelques autres de développeurs occasionnels dans mon genre.

    a+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher un message d'attente lors d'un submit
    Par lodan dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/04/2008, 15h01
  2. Afficher un message d'attente dans un traitement Batch
    Par rollingboy dans le forum Windows
    Réponses: 0
    Dernier message: 01/02/2008, 20h56
  3. Afficher une message d'attente lors d'un appel ajax
    Par Nulenprogra dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 06/11/2007, 22h15
  4. Réponses: 3
    Dernier message: 29/11/2006, 10h45
  5. Afficher un message d'attente en SQL Server
    Par bong03 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/05/2006, 09h43

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