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 :

[JSLider] Mise à jour


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Par défaut [JSLider] Mise à jour
    Bonjour,

    J'ai un lecteur de musique, et mon JSlider qui doit avancer en suivant la musique (classique quoi).

    Alors j'ai une boucle while qui tourne tout le long de la chanson :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while (!player.isComplete()) 
    			{
    				slider.setValeur(player.getPosition());
    				try 
    				{
    					Thread.sleep(1000);					
    				} 
    				catch (Exception e)
    				{
    					e.printStackTrace();
    				}
    			}
    Cette boucle appelle donc toutes les secondes la méthode setValeur, qui appelle elle-même la méthode setValue de JSlider à partir d'un Thread :

    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
     
    public class Curseur extends JPanel
    {
            public void setValeur(int i)
    	{
    		SliderThread pt = new SliderThread(i);
    		pt.start();
    	}
     
    	class SliderThread extends Thread 
    	{
    		int val;
     
    		public SliderThread (int i)
    		{
    			val = i;
    		}
     
    		public void run() 
    		{
    			slider1.setValue(val);
    		}
    	}
    }
    (Je mets que le code nécessaire)

    Le truc c'est que ça marche aléatoirement, parfois ça se bloque même en plein milieu etc...

    Quelqu'un aurait une méthode efficace, ou pourrait trouver l'erreur dans mon code?

    Merci d'avance!

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Par défaut
    Bonjour,

    De ce que je lit, tu lances un nouveau Thread toutes les secondes, c'est pas très économique...

    D'ailleurs je ne vois pas l'intéret du Thread juste pour modifier la valeur du slider.
    Ce qui doit être dans un Thread, c'est la boucle de lecture de ta musique pour ne pas bloquer l'EDT, mais je suppose que c'est déja le cas.

    Le mieux, c'est de créer un Timer qui va s'exécuter toutes les x millisecondes, et ou tu modifies le slider en fonction de la position du player, comme ça tu n'as toujours qu'un seul thread pour la mise à jour du slider.

    Regarde : java.util.Timer.scheduleAtFixedRate()

    Fred

  3. #3
    Membre confirmé Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Par défaut
    Merci de ta réponse.

    Alors j'ai fait ce que tu m'as dit :

    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
     
    public void setValeur(int i)
    	{	
    		valeur = i;
    		Timer t = new Timer(); 
     
    		GregorianCalendar gc = new GregorianCalendar(); 
    		gc.add(Calendar.SECOND, 3); 
    		t.scheduleAtFixedRate(new MyTask(), gc.getTime(), 1000); 
    	}
     
    	class MyTask extends TimerTask 
    	{ 
    		public void run()
    		{
    			slider1.setValue(valeur);
    		}
    	}
    Alors en fait ça fonctionne, mais comme avant, c'est aléatoire!

    Parfois ça se bloque ou ça ne démarre même pas.

    C'est pas un problème de mise à jour du JPanel qui contient le JSlider?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Par défaut
    Citation Envoyé par docv266 Voir le message
    Alors j'ai fait ce que tu m'as dit :
    Pas tout à fait, tu ne dois pas créer ton timer dans le setValue().
    La création du timer ne doit être faite qu'une seule fois.

    Si ta boucle de lecture ne servait qu'a ça, tu peux la supprimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Lancement du thread de lecture audio
     
    // Création du timer de mise à jour du slider
    Timer timer = new Timer();
    timer.schedule(new SliderUpdateTask(), 1000);
     
    public class SliderUpdateTask extends TimerTask 
    { 
       public void run()
       {
         slider1.setValue(player.getPosition());
       }
    }

    J'imaginais plutôt quelque chose dans ce style.

    Fred

Discussions similaires

  1. Comment empêcher la mise à jour d'un contrôle à l'écran ?
    Par JojoLaFripouille dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2003, 12h52
  2. [mise à jour]Comment procéder sans tout péter...
    Par FFF dans le forum Installation
    Réponses: 3
    Dernier message: 10/09/2003, 08h11
  3. Mise à jour de la version de MySQL
    Par jobstar dans le forum Administration
    Réponses: 8
    Dernier message: 18/08/2003, 10h45
  4. mise à jour de champs time (interbase)
    Par pram dans le forum XMLRAD
    Réponses: 6
    Dernier message: 04/03/2003, 10h25
  5. Réponses: 2
    Dernier message: 12/02/2003, 15h26

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