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 :
- for(;;) {
- Thread.sleep(200);
- if (player.getState()==600) {
- Double seconds = player.getMediaTime().getSeconds();
- flag = true; // bricolage, po bieng
- slider.setValue(seconds.intValue());
- flag = false; // bricolage
- }
- }
|
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 :
- private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {
- if (!jSlider1.getValueIsAdjusting() && mediaPlayer1.getState()==600 && !thread.flag) {
- Time i = new Time(new Double(jSlider1.getValue()));
- mediaPlayer1.setMediaTime(i);
- }
- }
|
Sauriez-vous comment faire ça proprement ?