带定时器的 Mp3 播放器 java [快进]
Mp3 player with timer in java [fast forward]
我正在我的 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);
}
您已经在冗余地跟踪两个变量 fis
和 bar
中的进度。为了良好的设计,使用其中一个来确定经过的时间,而不是使用 另一个 变量来达到相同的目的。
but have problem how to implement timer to jump 5% forward?
您似乎误解了计时器的用途。根据Timer
class documentation,它:
Fires one or more ActionEvents at specified intervals.
所以计时器并不是用来记录已经过去了多少时间的。它会根据您的配置每秒(每 1000 毫秒)简单地调用 TimerListener
的 actionPerformed(ActionEvent)
方法。
要获得更完整的答案,请 post 您 TimerListener
class 的代码。
备注
看来你的setTime(float)
方法是要重复调用的,所以这个方法应该不是初始化timer
变量。宁可初始化定时器一次,让它独自完成它的工作。
我假设您打算将提供的 float
参数 t
表示为 microseconds.
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);
}
我正在我的 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);
}
您已经在冗余地跟踪两个变量 fis
和 bar
中的进度。为了良好的设计,使用其中一个来确定经过的时间,而不是使用 另一个 变量来达到相同的目的。
but have problem how to implement timer to jump 5% forward?
您似乎误解了计时器的用途。根据Timer
class documentation,它:
Fires one or more ActionEvents at specified intervals.
所以计时器并不是用来记录已经过去了多少时间的。它会根据您的配置每秒(每 1000 毫秒)简单地调用 TimerListener
的 actionPerformed(ActionEvent)
方法。
要获得更完整的答案,请 post 您 TimerListener
class 的代码。
备注
看来你的
setTime(float)
方法是要重复调用的,所以这个方法应该不是初始化timer
变量。宁可初始化定时器一次,让它独自完成它的工作。我假设您打算将提供的
float
参数t
表示为 microseconds.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);
}