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

Composants Java Discussion :

Affichage JLabel en "décalé"


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut Affichage JLabel en "décalé"
    Bonjour,
    Je suis en train de faire une interface graphique en swing, dans laquel je fais l'affichage d'un mot entré par l'utilisateu sur plusieurs label, chaque lettre du mot est affiché dans un label.
    Tout fonctionne comme il faut, sauf que j'aimerais que l'utilisateur voit les lettres s'afficher les unes aprés les autres, et pas toutes en meme temps. J'ai essayé avec un Thread.sleep, mais ça ne le fait pas.
    Donc j'aimerai savoir si sauriez comment je peut faire.
    Merci pour vos reponses

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Le sleep devrait pouvoir marcher, mais sinon tu peux utiliser les Timer :
    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
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.Timer;
     
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements ActionListener {
    	private Timer timer = new Timer(300, this);
    	private JLabel label = new JLabel();
    	private String s = "Phrase écrite lettre par lettre";
    	private int i = 0;
     
    	public Test() {
    		add(label);
     
    		timer.start();
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(200, 100);
    		setVisible(true);
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		label.setText(label.getText() + s.charAt(i++));
    		if(i==s.length())timer.stop();
    	}
     
    	public static void main(String[] args) {
    		new Test();
    	}
    }
    Une version avec le sleep :
    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
    import javax.swing.JFrame;
    import javax.swing.JLabel;
     
     
    @SuppressWarnings("serial")
    public class Test extends JFrame {
    	private JLabel label = new JLabel();
    	private String s = "Phrase écrite lettre par lettre";
     
    	public Test() {
    		add(label);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(200, 100);
    		setVisible(true);
     
    		for(char c : s.toCharArray()){
    			label.setText(label.getText() + c);
     
    			try {
    				Thread.sleep(300);
    			} catch (InterruptedException e) {}
    		}
    	}
     
    	public static void main(String[] args) {
    		new Test();
    	}
    }

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    La version avec le Thread.sleep est une horreur absolue car elle bloque tout le repaint au niveau de l'EDT et bloque entièrement l'application. A banir.

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

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    ça marche niquel merci pour votre aide

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    ça marche bien comme je veux donc ça affiche bien les lettres les unes aprés les autres, le seul pb c'est que le timer ne s'arrete pas.
    Voici mon code :
    la fonction qui crée l'action et le timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	private Timer createTimer(){
    		ActionListener affiche = new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				lettres.get(add+compteur).setText(((Character)jeu.getMotCourant().charAt(add)).toString());
    				lettres.get(add+compteur).setBorder(BorderFactory.createRaisedBevelBorder());
    				lettres.get(add+compteur).setBackground(new Color(238,238,238));
    				if (add < jeu.getMotCourant().length()-1) 
    					add++;
    				System.out.println(add);
     
    			}
    		};
    		return new Timer(500,affiche);
    	}
    et la façon dont j'utilise le timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    					Timer t = createTimer();
    					add=0;
    					t.start();
    					System.out.println(add);
    					if(add == this.jeu.getMotCourant().length() - 1){ 
    						t.stop();
    					}
    le probleme c'est que dans cette partie du code, j'ai add qui est tjrs égal à 0 et donc il ne rentre pas dans le if et n'arrete pas le timer. J'ai essayé de faire une boucle avec isRunning sur le timer mais ça fait une boucle infinie.

    Pourriez vous m'aider ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Je te conseil d'utiliser le stop dans l'actionPerformed.
    Comme ça, à chaque coup du timer, tu peux vérifier la valeur en cours, et décider de le stopper lorsque ta condition est remplie.
    Par contre, il faut que ton timer soit accessible depuis l'ActionListener.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    J'ai essayé il me l'arrete bien mais si je test aprés dans la suite du programme avec isRunning ben c'est comme s'il l'avait pas arreté.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Le timer va gérer l'affichage de ton texte dans un thread différent de celui où tu utilises la méthode isRunning. Es-tu sûr que le Timer.stop() a été appelé lorsque tu utilise isRunning ?

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Exemple en reprenant le code que j'avais utilisé précédemment :
    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
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.Timer;
     
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements ActionListener {
    	private Timer timer = new Timer(300, this);
    	private JLabel label = new JLabel();
    	private String s = "Phrase écrite lettre par lettre";
    	private int i = 0;
     
    	public Test() {
    		add(label);
     
    		timer.start();
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(200, 100);
    		setVisible(true);
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		label.setText(label.getText() + s.charAt(i++));
    		if(i==s.length())timer.stop();
    		System.out.println(s.charAt(i-1) + " TIMER STATUS :" + timer.isRunning());
    	}
     
    	public static void main(String[] args) {
    		new Test();
    	}
    }
    Voilà le retour console :
    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
    P TIMER STATUS :true
    h TIMER STATUS :true
    r TIMER STATUS :true
    a TIMER STATUS :true
    s TIMER STATUS :true
    e TIMER STATUS :true
      TIMER STATUS :true
    é TIMER STATUS :true
    c TIMER STATUS :true
    r TIMER STATUS :true
    i TIMER STATUS :true
    t TIMER STATUS :true
    e TIMER STATUS :true
      TIMER STATUS :true
    l TIMER STATUS :true
    e TIMER STATUS :true
    t TIMER STATUS :true
    t TIMER STATUS :true
    r TIMER STATUS :true
    e TIMER STATUS :true
      TIMER STATUS :true
    p TIMER STATUS :true
    a TIMER STATUS :true
    r TIMER STATUS :true
      TIMER STATUS :true
    l TIMER STATUS :true
    e TIMER STATUS :true
    t TIMER STATUS :true
    t TIMER STATUS :true
    r TIMER STATUS :true
    e TIMER STATUS :false

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Oui j'ai verifier et il l'arrete bien. En fait une fois que le timer s'arrete et sort de l'actionPerformed dans la suite du code je test isRunning et il n'est pas arreté alors que je voudrai que le timer fasse l'action donc m'affiche les lettre les une aprés les autre qu'il me fasse la suite du code.
    Dois je tout mettre dans l'actionPerformed ?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Citation Envoyé par lucieb31 Voir le message
    En fait une fois que le timer s'arrete et sort de l'actionPerformed dans la suite du code je test isRunning et il n'est pas arreté
    L'erreur que tu fais, c'est de penser que le code qui suit le timer.start() attend que ce dernier ait terminé sont travail.
    Lorsque tu démarres ton timer, un nouveau Thread va être démarrer, afin que ton application ne soit pas figée.
    Les lignes qui suivent ton timer.start() sont lues sans attendre la fin des actions que ce dernier gère.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Je comprend, je vais alors essayé en mettant tout dans l'actionperformed du timer, et faire en sorte que ça s'execute seulement aprés que celui si soit terminé

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Sinon au lieu de mettre "tout" dans l'actionPerformed, fait un méthode que tu appels depuis l'actionPerformed.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(condition d arret du timer){
      timer.stop();
      methodePourContinuer();
    }
    Ca revient au même, mais c'est plus lisible !

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    c'est bon ça marche. Merci pour ton aide

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

Discussions similaires

  1. affichage de donnée avec double quote
    Par artichaudd dans le forum Langage
    Réponses: 4
    Dernier message: 24/11/2011, 12h35

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