public void mouseDragged(MouseEvent e) {
   if (lecteur != null) {
     if (e.getSource() == deplacement) {
       if (e.getModifiers() == MouseEvent.BUTTON1_MASK) {
         lecteur.setMediaTime(
             new Time(
                 (double) (deplacement.getValue() * lecteur.getDuration().getSeconds() / 100)));
       }
     }
   }
 }
  /**
   * 快进
   *
   * @param progress
   */
  private void seekTo(int progress) {
    try {
      if (mediaPlayer != null) {
        // float playedRate = (float) progress / songInfo.getDuration();
        // mediaPlayer.seekTo(playedRate);
        // mediaPlayer.stop();
        double totalTime = mediaPlayer.getDuration().getSeconds();
        double rate = progress * 1.00 / songInfo.getDuration();
        mediaPlayer.setMediaTime(new Time(totalTime * rate));
        // mediaPlayer.start();

        MediaManage.getMediaManage().setPlayStatus(MediaManage.PLAYING);
      }

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 // Stops the track, resets it to the beginning
 public void rewind() {
   player.stop();
   player.setMediaTime(Player.RESET);
 }
  /**
   * 播放歌曲
   *
   * @param songInfo
   */
  private void playInfoMusic(SongInfo msongInfo) {
    this.songInfo = msongInfo;
    if (songInfo == null) {

      SongMessage msg = new SongMessage();
      msg.setType(SongMessage.SERVICEERRORMUSIC);
      msg.setErrorMessage(SongMessage.ERRORMESSAGEPLAYSONGNULL);
      ObserverManage.getObserver().setMessage(msg);

      return;
    }
    File songFile = new File(songInfo.getFilePath());

    if (!songFile.exists()) {
      logger.error("播放文件不存在!");
      // 下一首
      SongMessage songMessage = new SongMessage();
      songMessage.setType(SongMessage.NEXTMUSIC);
      ObserverManage.getObserver().setMessage(songMessage);

      return;
    }

    try {
      if (mediaPlayer == null) {
        // mediaPlayer = new MediaPlayer();
        // // mediaPlayer.setDataSource(songInfo.getFilePath());
        // //
        // // float playedRate = (float) songInfo.getPlayProgress()
        // // / songInfo.getDuration();
        // // mediaPlayer.seekTo(playedRate);
        // mediaPlayer.setMediaLocator(new MediaLocator(songInfo
        // .getFilePath()));
        File file = new File(songInfo.getFilePath());
        mediaPlayer = Manager.createRealizedPlayer(new MediaLocator(file.toURL()));

        initVolume();

        mediaPlayer.prefetch(); // 获取媒体数据

        double totalTime = mediaPlayer.getDuration().getSeconds();
        double rate = songInfo.getPlayProgress() * 1.00 / songInfo.getDuration();
        mediaPlayer.setMediaTime(new Time(totalTime * rate));
        mediaPlayer.prefetch();
        mediaPlayer.start();
      }
    } catch (Exception e) {
      logger.error("不能播放此文件:" + songInfo.getFilePath());
      e.printStackTrace();

      SongMessage songMessage = new SongMessage();
      songMessage.setType(SongMessage.NEXTMUSIC);
      ObserverManage.getObserver().setMessage(songMessage);
    }
    if (mediaPlayer != null) {
      mediaPlayer.addControllerListener(
          new ControllerListener() {

            @Override
            public void controllerUpdate(ControllerEvent e) {
              // 当媒体播放结束时
              if (e instanceof EndOfMediaEvent) {
                mediaPlayer.setMediaTime(new Time(0));
                mediaPlayer = null;
                SongMessage songMessage = new SongMessage();
                songMessage.setType(SongMessage.NEXTMUSIC);
                ObserverManage.getObserver().setMessage(songMessage);
              }
            }
          });
      // mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
      //
      // @Override
      // public void onProgressChanged() {
      //
      // float playedRate = mediaPlayer.getPlayedRate();
      //
      // long playProgress = (long) (songInfo.getDuration() * playedRate);
      //
      // if (songInfo != null) {
      // songInfo.setPlayProgress(playProgress);
      // SongMessage msg = new SongMessage();
      // msg.setSongInfo(songInfo);
      // msg.setType(SongMessage.SERVICEPLAYINGMUSIC);
      // ObserverManage.getObserver().setMessage(msg);
      // }
      // }
      //
      // @Override
      // public void onCompletion() {
      //
      // SongMessage songMessage = new SongMessage();
      // songMessage.setType(SongMessage.NEXTMUSIC);
      // ObserverManage.getObserver().setMessage(songMessage);
      // }
      // });
    }

    if (lrcThread == null) {
      lrcThread = new Thread(new LrcRunable());
      lrcThread.start();
    }
  }
  public static void play(Playlist playlist, int indexofmedia) throws Exception {
    // la valeur x est utilis�e pour le positionnement du JScroolPane de la
    // JTable
    // la valeur qu'elle cotient � �t� choisit par des experiences que nous
    // avons r�alis�s
    instance.setsStates(SunoneStates.IN_PLAY);
    int x = (4 * 414) / 23;
    // recup�ration du chemin d'une musique dans la playlist
    // la m�thode open file est d�finie dans la classe FileEdited permet juste
    // de lire et renvoyer le chemin d'un fichier
    BufferedReader br = FileEdited.openFile(playlist.getName(), indexofmedia);
    String s = br.readLine();
    br.close();
    CURRENTMEDIA = s;

    do { // debut la grande boucle qui boucle jusqu'� la fin du fin de la playlist
      // et r�p�te eventuellement lorsque Repeter la playlist(REPEATPLAYLIST) est
      // activ�e
      while (s != null) { // boucle de lecture jusqu'� la fin du fichier afin de reinitialiser
        // les param�tres pour la lecture avant de tester repeatPlaylist.

        if (s != null) // debut du trraitement pour chaque fichier multimedia
        // dont le chemin a �t� lu dans la playlist.
        {
          // localisation du m�dia gr�ce � la classe Medialocator de JMF
          // cette methode permet d'encapsuler le media elle permet nous permet
          // donc
          // de faire abstraction du format du fichier utili� ( qu'il soit
          // mp3,mpg, avi ou autres)
          MediaLocator mediaLocator = new MediaLocator((new File(s).toURL()).toString());
          do { // debut de la boucle dont la condition de sortit est que repeter
            // musique
            // ne soit pas activ�.si REPEATMEDIA est activ� il repete la m�me
            // musique.
            try {

              // creation du player. c'est sur lui que le traitement se fait
              // on utilise la classe Manager qui est le gestionnaire permettant
              // return
              // un player (qui est en fait une thread) et c'est sur elle que
              // les op�rations de lecture se feront.
              player = Manager.createPlayer(mediaLocator);

              // ajout du listener qui permet d'�couter les differents phases
              // par lesquels passent
              // le player: de la realisation au debut de la lecture comme nous
              // le verons dans son code
              player.addControllerListener(
                  new ControllerAdapter() {
                    double dureeTotale = 0;

                    // permet d'�couter la fin de la r�alisation du media cet �tat
                    // ne peut �tre atteint que lorsque
                    // la m�thode realise() a �t� appel� auparavant.
                    // lorsque la r�alisation se termine par exemple par exemple, on
                    // peut retirer plusieurs
                    // propri�t� du media. Comme la dur�e totale
                    public void realizeComplete(RealizeCompleteEvent re) {
                      // recuperation de la dur�e du media.
                      dureeTotale = player.getDuration().getSeconds();
                      try {
                        if (PLAYSTATUS != NEXTWASPAUSE) {
                          // quelques initialisations des labels centraux de
                          // l'interface graphique
                          // aussi bien celui du nom de l'artiste que celui de la
                          // dur�e totale de la musique
                          GUI.getInstance().jLabel6.setText("00:00/00:00");
                          GUI.getInstance().jLabel.setText(getArtistName(CURRENTMEDIA));
                          GUI.getInstance().jSlider1.setValue(0);
                        }
                      } catch (Exception e) {
                      }
                      GUI.getInstance().jSlider1.setMaximum((int) dureeTotale);
                      player.prefetch();
                    }

                    public void prefetchComplete(PrefetchCompleteEvent pe) {
                      GUI.getInstance().reinitialiseComposantsLecteur();
                      GUI.getInstance().mediaVisuel = player.getVisualComponent();
                      if (GUI.getInstance().mediaVisuel != null)
                        GUI.getInstance()
                            .mediaVisuel
                            .addMouseListener(
                                new MouseListener() {

                                  public void mouseClicked(MouseEvent e) {
                                    if (e.getClickCount() == 2) {
                                      if (fullScrean == 0) {
                                        fullScrean = 1;
                                        GUI.getInstance().fullScrean =
                                            GUI.getInstance().getFullScrean();
                                        Toolkit kit = Toolkit.getDefaultToolkit();
                                        Dimension screen = kit.getScreenSize();
                                        GUI.getInstance().fullScrean.setSize(screen);
                                        GUI.getInstance()
                                            .fullScrean
                                            .add(GUI.getInstance().mediaVisuel);
                                        GUI.getInstance().setVisible(false);
                                        GUI.getInstance().fullScrean.setAlwaysOnTop(true);
                                        GUI.getInstance().fullScrean.setVisible(true);

                                      } else {
                                        fullScrean = 0;
                                        GUI.getInstance()
                                            .videoPanel
                                            .add(
                                                GUI.getInstance().mediaVisuel, BorderLayout.CENTER);
                                        GUI.getInstance().fullScrean.setVisible(false);
                                        GUI.getInstance().setVisible(true);
                                        GUI.getInstance().fullScrean = null;
                                      }
                                    }
                                  }

                                  public void mouseEntered(MouseEvent e) {}

                                  public void mouseExited(MouseEvent e) {}

                                  public void mousePressed(MouseEvent e) {}

                                  public void mouseReleased(MouseEvent e) {}
                                });
                      player.getGainControl().setDB(-70 + GUI.getInstance().jSlider.getValue());
                      if (GUI.getInstance().mediaVisuel != null) {
                        GUI.getInstance()
                            .jContentPane
                            .add(GUI.getInstance().getJPanel4(), BorderLayout.CENTER);
                        GUI.getInstance()
                            .videoPanel
                            .add(GUI.getInstance().mediaVisuel, BorderLayout.CENTER);
                        GUI.getInstance().videoPanel.setVisible(true);
                        GUI.getInstance().videoPanel.setTitle("SunOne");
                        GUI.getInstance().videoPanel.pack();
                        if (GUI.getInstance().fullScrean != null) {
                          GUI.getInstance().fullScrean.add(GUI.getInstance().mediaVisuel);
                          GUI.getInstance().fullScrean.setVisible(true);
                        }
                      }
                      player.start();
                    }
                  });
              player.realize();

              while (player.getState() != Player.Started) {
                Thread.sleep(70);
              }
              String timeTotal = conversion((int) player.getDuration().getSeconds());
              GUI.getInstance().jTable.setValueAt(timeTotal, CURRENTINDEXMEDIA, 2);
              GUI.getInstance().jTable.setValueAt(GUI.fleche, CURRENTINDEXMEDIA, 0);
              if (CURRENTINDEXMEDIA != 0)
                GUI.getInstance().jTable.setValueAt(" ", CURRENTINDEXMEDIA - 1, 0);
              GUI.getInstance()
                  .jScrollPane
                  .getVerticalScrollBar()
                  .setValue(((4 * 414) / 23) * (CURRENTINDEXMEDIA / 4));
              x += x;
              scrollIncrement = 0;
              if (PLAYSTATUS == NEXTWASPAUSE) {
                player.setMediaTime(TIME);
                PLAYSTATUS = -1;
              }
              while (player.getState() == Player.Started) {
                Thread.sleep(1000);
                int i = (int) player.getMediaTime().getSeconds();
                GUI.getInstance().jSlider1.setValue(i);
                GUI.getInstance().jLabel6.setText(conversion(i) + "/" + timeTotal);
              }

            } catch (NoPlayerException noplayeur) {

              noplayeur.printStackTrace();
            } catch (IOException io) {
              io.printStackTrace();
            }
          } while (REPEATMEDIA == ACTIVE);
        }
        CURRENTINDEXMEDIA = CURRENTINDEXMEDIA + 1;
        br = FileEdited.openFile(playlist.getName(), CURRENTINDEXMEDIA);
        s = br.readLine();
        br.close();
        CURRENTMEDIA = s;
      } // fin de while on a atteint la fin du fichier
      // est assez important car il faut reinitialiser les param�tres et tester
      // si repeat eat actif
      // c'est � dire se replacer au debut du fichier.
      br = FileEdited.openFile(playlist.NAME, 0);
      s = br.readLine();
      br.close();
      CURRENTMEDIA = s;
      CURRENTINDEXMEDIA = 0;

    } while (REPEATPLAYLIST == ACTIVE); // fin de la grande boucle qui tete repeat
    // playlist

  }