Problème avec un JSlider dans un lecteur audio

Problème avec un JSlider dans un lecteur audio - Java - Programmation

Marsh Posté le 24-04-2007 à 20:12:44    

Je suis en train de développer un lecteur de média basique, qui utilise JMF.

 

J'ai réussi à naviguer dans le fichier en déplaçant un JSlider. (le composant Player possède une methode setMediaTime)
Naturellement, je voudrais aussi que le curseur de ce JSlider se déplace tout seul lors de la lecture.

 

J'ai donc un thread qui recupere tous les X ms le temps actuel de la video, et qui actualise la position du curseur en fonction :

Code :
  1. for(;;) {
  2.                 Thread.sleep(200);
  3.                     if (player.getState()==600) {
  4.                           Double seconds = player.getMediaTime().getSeconds();
  5.                           flag = true; // bricolage, po bieng
  6.                           slider.setValue(seconds.intValue());
  7.                           flag = false; // bricolage
  8.                 }
  9. }
 

D'autre part j'ai dans ma classe de l'interface graphique un Listener qui écoute le jSlider (noms différents mais y'en a qu'un) et qui bouge dans la vidéo quand on déplace le curseur. Le problème, c'est que le code suivant doit s'executer quand l'utilisateur bouge le slider, et PAS quand le thread modifie la valeur du slider.

 

La seule solution que j'ai trouvée pour empêcher ça, c'est l'utilisation d'un flag, méthode moche et pas vraiment fiable, qui permet de repérer quand la modif de la valeur du JSlider vient du thread.

Code :
  1. private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {       
  2.             if (!jSlider1.getValueIsAdjusting() && mediaPlayer1.getState()==600 && !thread.flag) {
  3.                     Time i = new Time(new Double(jSlider1.getValue()));
  4.                      mediaPlayer1.setMediaTime(i);
  5.              }
  6. }

Sauriez-vous comment faire ça proprement  :jap:  ?

Message cité 1 fois
Message édité par frankie_flowers le 24-04-2007 à 20:16:18
Reply

Marsh Posté le 24-04-2007 à 20:12:44   

Reply

Marsh Posté le 10-05-2007 à 20:00:21    

Bon j'ai trouvé une solution plus fiable, mais c'est pas encore super clair je trouve : je unregister le Listener avant chaque mise à jour auto, et le register juste après

frankie_flowers a écrit :

Code :
  1. for(;;) {
  2.                 Thread.sleep(200);
  3.                     if (player.getState()==600) {
  4.                           Double seconds = player.getMediaTime().getSeconds();
  5.                           slider.removeListener(blabla)
  6.                           slider.setValue(seconds.intValue());
  7.                           slider.addListener(blabla)
  8.                 }
  9. }


Y'a mieux comme solution pour une seek-bar ?


Message édité par frankie_flowers le 10-05-2007 à 20:00:45
Reply

Marsh Posté le 11-05-2007 à 00:35:02    

Salut,
 
oui en principe il ya mieux.
 
Les players de JMF possèdent des contrôles qui permettent de controller un certain nbre de paramètres, genre volume du son, seekbar etc...
 
Regarde la classe javax.media.control.FramePositioningControl et les exemples de JMF. Ils sont assez faciles à réutiliser et améliorer.
Tiens, tu peux essayer qqch dans le genre de  

Code :
  1. FramePositioningControl fpc = (FramePositioningControl)player.getControl("javax.media.control.FramePositioningControl" );


 :hello:


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 11-05-2007 à 02:56:14    

Merci :jap: je regarde ça

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed