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

Agents de placement/Fenêtres Java Discussion :

[JFrame] fenetre grise pendant le sleep


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut [JFrame] fenetre grise pendant le sleep
    Bonjour,

    J'ai un petit problème avec l'affichage de ma fenêtre: lorsque je met un sleep derrière, la fenêtre reste grise le temps du sleep et ne s'affiche qu'après.
    Cela fait la même chose quand je fais un truc du genre une boucle très longue qui affiche qqch à chaque passage (la fenetre ne s'affiche vraiement que lorsque la boucle est finie).
    J'ai par contre remarqué que cela ne se fait que lorsque je créé une fenêtre à partir d'un listener.
    En fait, je veux faire une fenêtre avec un bouton dessus, et lorsqu'on clique sur le bouton, ca affiche une fenêtre avec un message "traitement en cours, patientez...".
    J'ai donc fait une classe pour ma fenetre principale, une classe pour le listener du bouton, et une classe pour la fenetre "patientez", et j'appelle la classe patientez dans le listener (dans la méthode ActionPerformed), après quoi je fais un sleep(5000)

    mais voila, ma fenetre patientez reste grise tant que le sleep n'est pas fini.

    Quelqu'un pourrait-il m'expliquer?
    Dois-je ajouter une partie du code pour être plus clair?

    Merci

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Par défaut
    Voir la FAQ sur les thread.

  3. #3
    Membre confirmé
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Par défaut
    En 2 mots, ton programme est mono-thread. Il ne fait qu'une chose à la fois: affiche la fenêtre, faire un traitement (Listener), attendre (sleep). Ton programme fait donc, un affichage de fenêtre, réagit à un clic, attend 5 minutes, affiche la fenêtre, ...

    Pour avoir quelque chose de mieux, il faut faire un programme multi-thread. Un thread qui affiche la fenêtre, réagit aux clicks ... et un autre qui fait un sleep (ou un traitement plus intéressant )

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    En gros si j'ai bien compris, le thread courant attend d'être sorti du listener pour afficher la fenetre?

  5. #5
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    oui ... c'est tout a fait ca. La solution est de lancer l'execution du listener dans un thead a part.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    Mais alors pourquoi il commence à m'afficher la fenetre(l'emplacement, le titre, et les options de fermeture de fenetre), mais il m'affiche pas les composants (ni les changements de curseurs)?

  7. #7
    Membre confirmé
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Par défaut
    Il faudrait voir le code pour mieux expliquer et comprendre ce qui se passe.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    ya un truc que j'ai pas du comprendre...

    Voila ce que j'ai fait:
    J'ai créé une méthode A qui hérite de Thread, avec un constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public A()
    {
    	start();
    }
    et avec une méthode run qui créé une fenêtre, lui ajoute un bouton et l'affiche.

    A partir de mon listener, je créé un nouvel objet de type A Et après dans mon listener je fait un sleep(5000)
    Et ca m'affiche toujours le cadre de la fenêtre avant le sleep et le bouton après...
    Si il faut désactiver le Thread principal avant de lancer l'autre, comment on fait?

  9. #9
    Membre confirmé
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Par défaut
    Peux-tu mettre le code complet ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    Voila le code, que je vais essayer de simplifier au max:

    classe qui affiche le message d'attente:
    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
    import javax.swing.*;
     
    public class fenwait extends Thread
    {
    	public fenwait()
    	{
    		start();
    	}
     
    	public void run()
    	{
    		JFrame jf = new JFrame();
    		jf.setTitle("Traitement en cours...");
    		jf.getContentPane().setLayout(null);
     
    		JButton annuler = new JButton("annuler");
    		annuler.setBounds(new Rectangle(55,80,80,25));
     
    		jf.getContentPane().add(annuler);
    		jf.setBounds(400,250,200,150);
    		jf.setVisible(true);  //là il y a un problème ca n'affiche que le cadre de la fenêtre et son titre
    	}
     
    }
    listener qui appelle cette classe:
    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
     
    import java.awt.event.*;
    import javax.swing.*;
     
    public class listenerbtvalid implements ActionListener
    //est appelé quand l'utilisateur valide le formulaire
    {
         public listenerbtvalid()
        {
        }
        public void actionPerformed(ActionEvent e)
        {		
              {
    	//ouverture d'une fenetre patientez
    	fenwait fwait = new fenwait();
     
    	try
    	{
    		Thread.sleep(5000);
    	}
    	catch(InterruptedException ie)
    	{
                           System.out.println("erreur:"+ie);
    	}
              }
         }
    }
    et ensuite on ajoute ce listener à partir d'une autre classe principale, avec la méthode main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static void main(String[] args) 
    {
    	JFrame jf = new JFrame();
    	jf.getContentPane().setLayout(null);
    	jf.setBounds(200,200,200,200);
    	JButton jb = new JButton("bouton");
    	listenerbtvalid lbval = new listenerbtvalid();
    	jb.addActionListener(lbval);
    	jb.setBounds(50,50,100,100);
    	jf.getContentPane().add(jb);
    	jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	jf.setVisible(true);
    }
    voila...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    pourtant là je devrais créer un nouveau thread, et afficher la fenêtre dans ce thread, donc le sleep, qui n'est pas dans le même thread que la fenêtre, ne devrait pas retarder l'affichage complet de celle-ci?

    ps:dsl si je suis emmerdant mais j'aimerais bien comprendre et surtout que ca marche

  12. #12
    Membre expérimenté
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Par défaut
    En fait tu n'as pas bien compris ce qu'on a essayé de te dire.
    En clair, il aurais fallu faire :
    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
     
    import java.awt.Rectangle;
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    /**
     * <br>
     * -------------------------------- <br>
     * Pour le site <a href="http://www.developpez.com" target="_blank">www.developpez.com</a> <br>
     * @author JHelp
     * @version 1.0
     */
    public class FenWait
          implements Runnable
    {
       private Thread thread;
       private JFrame jf;
       public FenWait()
       {
          jf = new JFrame();
          jf.setTitle("Traitement en cours...");
          jf.getContentPane().setLayout(null);
          JButton annuler = new JButton("annuler");
          annuler.setBounds(new Rectangle(55, 80, 80, 25));
          jf.getContentPane().add(annuler);
          jf.setBounds(400, 250, 200, 150);
       }
       public void start()
       {
          jf.setVisible(true);
          if(this.thread == null)
          {
             this.thread = new Thread(this);
             this.thread.start();
          }
       }
       public void run()
       {
          try
          {
             Thread.sleep(5000);
          }
          catch(Exception e)
          {
          }
          jf.setVisible(false);
          this.thread = null;
       }
    }
    En pour l'utiliser dans ton code, il faut avoir une instance de FenWait initialiser. Et a chaque fois que tu as besoin de la faenêtre d'attente, faite un start dessus.
    J'ai fais un Runnable et non un Thread pour pouvoir fair plusieurs start dessus. Sinon tu pourais ne ne faire qu'une fois

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    ca marche!!
    Merci!!
    J'ai pas bien compris le this.thread = new thread(this), mais bon...

  14. #14
    Membre expérimenté
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Par défaut
    Pour comprendre, faut regarder la javadoc à Thread.
    Tu y verras le constructueur Thread(Runnable).
    En fait je construis un thread à partir d'un Runnable, qui se trouve être la classe elle même.
    Le Thread créée utilisara le run de la classe Runnable, c'est à dire ici le run de la classe.
    Ca te semble plus clair maintenant ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    si j'ai bien compris là tu créé un thread pour lancer un sleep en parallèle au thread principal, où la fenêtre s'affiche.
    Je comprend pas la différence entre ca et créer un nouveau thread pour afficher la fenêtre et lancer le sleep dans le thread principal.
    Et je sais pas comment faire pour fermer automatiquement la fenêtre d'attente après la fin du sleep
    Et puis surtout je comprend pas pourquoi il me lance pas mes commandes les unes après les autres, mais (par exemple pour la fenetre) à la fin des listeners! (je comprend pas poursuoi il me lance la boucle d'affichage des i de 1 à 10000 avant la fenêtre, qui pourtantétait avant dans le code)

    Mais je vais aller voir dans la JRE ca pourra peut-etre m'éclairer

  16. #16
    Membre expérimenté
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Par défaut
    La différence est que si tu fais le sleep dans le thread principal, c'est lui qui cva attendre, et donc tout bloquer, que le faire en appralléle, le thread va attendre les 5 secondes et farmée la fenêtre (cf code du run) Je recrée un nouveau Thread à chaque fois qu'on lance le start pour pouvoir lancer plusieurs fois la chose, sinon tu ne pourais le faire qu'une seulle fois. Un Thread ne supporte pas deux fois un start.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Par défaut
    et donc la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i = 0;i<1000000;++i)
    {System.out.println(i);}
    fait la même chose en gros que le sleep?
    Parceque quand je fais une boucle comme ca , ca fait la meme chose que quand je fais le sleep (alors qu'il devrait gérer en parallèle la boucle for et l'affichage de la fenêtre, non?)

    Et puis je ne veux meme pas faire la boucle et lancer la fenetre en parallèle, je veux:
    -1: afficher la fenêtre
    -2: faire la boucle

  18. #18
    Membre expérimenté
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Par défaut
    Citation Envoyé par The Wretched
    je veux:
    -1: afficher la fenêtre
    -2: faire la boucle
    C'est exactement ce que fait la solution que je t'ai proposée.
    Autrement, en fait la boucle for et le sleep ne font pas la même chose. La boucle for occupe ton cpu à compter, tandis que le sleep endors pendant un certain temps. Le sleep estplus optimiser car noccupe pas ton cpu.
    En fait si tu as l'impression que ca fait la même chose, c'est que tta boucle for à un corps ton court, ce qui fait que le cpu ne prends pas le temps de faire autre chose.

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

Discussions similaires

  1. Neutraliser l'interactivité d'une application pendant un sleep
    Par pelerin98 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/11/2014, 13h38
  2. Afficher fenetre transparente pendant un jeu video
    Par predalpha dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/09/2012, 16h54
  3. Réponses: 1
    Dernier message: 06/11/2010, 11h27
  4. masquer fenetre VBE pendant l'écriture de code
    Par oxedet dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/01/2008, 15h51
  5. Rafraichissement de la fenetre pendant le traitement
    Par Bobx dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/02/2003, 16h13

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