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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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, 11h35

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