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 :

Problème avec l'instruction Thread.sleep


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut Problème avec l'instruction Thread.sleep
    [I]Bonjour,
    Dans le cadre d'un petit programme, j'a réalisé une application qui est censée afficher alternativement une image puis une autre image. Pour cela j'ai utilisé l'instruction Thread.sleep() pour que le programme affiche une image, attende 1 seconde, affiche une autre image, attende 1 seconde...

    Lorsque j'exécute ce programme à part, tout se passe bien, mais lorsque j'intègre le code du programme dans un autre programme (qui est en fait le menu du logiciel), le Thread.sleep ne marche pas, et au lieu d'afficher alternativement les deux images, la fenêtre reste blanche au début puis affiche seulement la dernière image.

    Voici le code source du programme qui fonctionne correctement quand il est lancé à part :

    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
     
    public class Fenetre extends JFrame {
    	public Fenetre() {         
    		new JFrame();
    		this.setTitle("Série d'images");
    		this.setSize(500, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    		this.setContentPane(new Panneau2());
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.validate();
    		this.setContentPane(new Panneau());
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.validate(); 
    		this.setContentPane(new Panneau2());
     
    	}
    }
    Les classes Panneau et Panneau2 servent seulement à afficher l'une ou l'autre des deux images.

    Et voici comment j'intègre le code précédent au code du menu (je ne mets que la partie du code qui correspond car le code entier est trop long) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public static class Test extends JPanel  implements ActionListener{
     
    		public void actionPerformed (ActionEvent e){ 
     
    			fenetre.dispose();
    				new Fenetre();
    		}
     
     
     
    	}
    Je ne sais pas à quel niveau se situe le problème, mais il est possible qu'il y ait des erreurs liées au fait que je débute en java, donc merci de me signaler si quelque chose ne va pas.
    Je vous remercie de votre aide.

  2. #2
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Tu à essayé de l'intégrer dans un thread à part? Parce que là le thread de ton jpanel aussi prend le sleep...

    Et au passage, ta fenêtre étend jframe, donc ne fais pas new jframe() dans ton constructeur mais super()

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    avec des Thread.sleep, tu bloque le thread courant. Avec ton intégration, le thread courant, c'est le thread graphique => tu bloque l'interface graphique.

    Tu ne devrais pas faire de Thread.sleep, en encore moins dans un constructeur. On attends d'un constructeur qu'il construise et préparer l'objet, pas qu'il fasse tout y compris le café.

    Dans ton cas, si cette fenêtre a pour but de faire défiler des images, je te recommanderais:

    d'utiliser javax.swing.Timer pour gérer le défilement
    de démarrer ce timer soit dans le constructeur (démarrage automatique), soit dans une méthode à part, que tu appellerais après avoir construit la fenêtre (à préférer, ça évite d'exposer this avant la fin du constructeur)

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut
    cafeinoman : merci pour l'indication concernant le JFrame.
    tchize : comment est-ce que je peux utiliser le timer dans ce cas, parce que je dois faire afficher deux images alternativement, mais pour l'instant j'ai seulement trouvé la méthode scheduleAtFixedRate() qui permet d'exécuter une action de manière périodique, donc si tu connais une instruction qui puisse m'être utile, je suis preneur.
    Merci.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ben oui, a intervale régulier, tu change l'image, tout simplement

  6. #6
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Si j'ai bien compris la suggestion de Tchize :

    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
     
    public class Fenetre extends JFrame {
    	public Fenetre() {         
    		super();
                    init();
     
    		this.setContentPane(new Panneau2());
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.validate();
    		this.setContentPane(new Panneau());
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.validate(); 
    		this.setContentPane(new Panneau2());
     
    	}
     
            private void init () {
                    this.setTitle("Série d'images");
    		this.setSize(500, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(
                           JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
                    int pan=0;
                    ActionListener listener = new ActionListener (
     
                         @Override
                         public void actionPerformed(ActionEvent evt) {
                         switch(pan++% 2){
                         case (0):this.setContentPane ( new Panneau ( ) ); break;
                         case (1):this.setContentPane ( new Panneau2 ( ) ); break;
                         }      
                 }
                 Timer timer = new Timer (1000, listener);
                 timer.start ();
           }
     
    }
    Bon courage.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut
    salut,
    en réponse à cafeinoman, j'ai un problème avec la méthode private void init() : il me semble que tu t'es trompé après le new ActionListener : tu rajoutes une parenthèse, mais du coup lorsque je l'enlève, j'ai beau tout essayer (doubles parenthèses, accolades...), eclipse me signale des erreurs sur les accolades... je ne vois pas où est le problème :
    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
     
     
    public class Fenetre extends JFrame {
    	public Fenetre() {         
    		super();
    		init();
     
    		this.setContentPane(new Panneau2());
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.validate();
    		this.setContentPane(new Panneau());
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.validate(); 
    		this.setContentPane(new Panneau2());
     
    	}
     
    	private void init () {
    		this.setTitle("Série d'images");
    		this.setSize(500, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(
    				JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    		int pan=0;
    		ActionListener listener = new ActionListener (
     
    				@Override
    				public void actionPerformed(ActionEvent evt) {
    					switch(pan++% 2){
    					case (0):this.setContentPane ( new Panneau ( ) ); break;
    					case (1):this.setContentPane ( new Panneau2 ( ) ); break;
    					}      
    				}
    				Timer timer = new Timer (1000, listener);
    				timer.start ();
    	}
     
    }
    sinon cela me semble une bonne idée mais est-ce que le problème sera résolu malgré qu'il y ait encore le Thread.sleep() ? Parce que d'après mes essais c'est bien cette instruction qui posait problème lorsque le programme lagguait.

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

Discussions similaires

  1. Problème avec repaint() et Thread.sleep
    Par fab13 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 12/08/2008, 23h02
  2. [aide]probléme avec l'instruction group by
    Par diden138 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/05/2007, 07h09
  3. Problème avec une instruction VBA
    Par Jpeg69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/05/2007, 12h58
  4. Problème avec l'instruction IN : 16 bits retournés
    Par HadiNET dans le forum Assembleur
    Réponses: 4
    Dernier message: 11/02/2006, 17h43
  5. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56

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