在java中使用计时器的MP3播放器[快进]

时间:2015-01-13 21:08:40

标签: java timer mp3

我在Mp3播放器中制作快进按钮。我已经为此编写了代码,但是如何实现计时器以向前跳5%有问题?我的意思是当我按下按钮计时器时应该向总长歌的5%跳跃。这是我的fastForward方法。

public void FastForward(){
        try {
            //songTotalLength = fis.available();
            fis.skip((long) ((songTotalLength * 0.05)));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 

这是按钮方法:

private void jButton3ActionPerformed(ActionEvent e) {
        mp3.FastForward();
        if(mp3.player.isComplete()){
            bar = 100;
        }
        jProgressBar1.setValue((int)bar);
        bar+=5;
    }

这个是定时器:

private void setTime(float t) {  
        int mili = (int) (t / 1000);
        int sec = (mili / 1000) % 60;
        int min = (mili / 1000) / 60;
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        end.set(Calendar.MINUTE, 0 + min);
        end.set(Calendar.SECOND, 0 + sec);
        timer = new javax.swing.Timer(1000, new TimerListener());
        percent = (float)100/(min*60+sec);
    }

1 个答案:

答案 0 :(得分:0)

您已经在冗余地跟踪两个变量fisbar的进度。为了良好的设计,使用其中一个来确定经过的时间,而不是使用另一个变量用于相同的目的。

  

但有问题如何实现计时器向前跳5%?

你好像误解了Timer的目的。根据{{​​3}},它:

  

按指定的时间间隔触发一个或多个ActionEvent。

因此计时器并不是要记录已经过了多长时间。它只需在您配置的情况下每秒调用一次actionPerformed(ActionEvent) TimerListener方法(每1000毫秒)。

要获得更完整的答案,请发布TimerListener课程的代码。

备注

  • 您的setTime(float)方法似乎是重复调用的,因此此方法不应初始化timer变量。而是将计时器初始化一次并完全放下它来完成它的工作。

  • 我假设您打算使用提供的float参数t来代表Timer class documentation

  • float数据类型只有7位精度。这可能没问题,因为你只对几分钟和几秒感兴趣,否则浮动只会在失去准确性之前长达四个月左右。

  • 您似乎希望按钮点按处理程序执行此操作(尽快增加bar):

private void jButton3ActionPerformed(ActionEvent e) {
  mp3.FastForward();
  bar+=5; // increment bar before checking complete, and before setting progress
  if(mp3.player.isComplete()){
    bar = 100;
  }
  jProgressBar1.setValue((int)bar);
}