我正在使用JMF制作媒体播放器,我想使用自己的控件组件 任何人都可以帮我制作媒体播放器的搜索栏,以便它可以根据滑块位置播放歌曲。
只是建议我一些逻辑,然后我可以弄清楚编码部分
if(player!=null){
long durationNanoseconds =
(player.getDuration().getNanoseconds());
durationbar.setMaximum((int) player.getDuration().getSeconds());
int duration=(int) player.getDuration().getSeconds();
int percent = durationbar.getValue();
long t = (durationNanoseconds / duration) * percent;
Time newTime = new Time(t);
player.stop();
player.setMediaTime(newTime);
player.start();
mousedrag=true;
这是代码。现在我如何让滑块与歌曲一起移动? 当我拖动/点击它时,滑块会起作用,但它不随着歌曲移动。
答案 0 :(得分:7)
使用滑块的问题是,当以编程方式移动滑块位置时,它会触发事件。在滑块上触发事件时,通常表示应用程序。必须做点什么,比如移动歌曲位置。效果是永无止境的循环。通过设置标志并忽略某些事件,可能有办法解决这个问题,但我决定采用不同的方式。
相反,我使用JProgressBar
来表示跟踪中的位置,并使用MouseListener
来检测用户点击单独位置的时间。使用Swing Timer
更新进度条,每隔50-200毫秒检查一次轨道位置。检测到MouseEvent
时,请重新定位曲目。
可以在此GUI的右上角看到该栏。将鼠标悬停在它上方会产生一个工具提示,显示该鼠标位置的轨道时间。
答案 1 :(得分:3)
答案 2 :(得分:1)
您无需revalidate
容器即可更改滑块。
每次创建新玩家时都使用这些行:
slider.setMinimum(0);
slider.setMaximum(duration);
slider.setValue(0);
new UpdateWorker(duration).execute();
其中duration
是以秒为单位保存歌曲持续时间的变量。
以下是更新滑块的代码(用作内部类):
private class UpdateWorker extends SwingWorker<Void, Integer> {
private int duration;
public UpdateWorker(int duration) {
this.duration = duration;
}
@Override
protected Void doInBackground() throws Exception {
for (int i = 1; i <= duration; i++) {
Thread.sleep(1000);
publish(i);
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
slider.setValue(chunks.get(0));
}
}
现在滑块会向右移动,直到歌曲结束。
另请注意,除非您想使用自定义滑块,否则JMF会通过player.getVisualComponent()
提供一个简单(且有效)的滑块(请参阅this example)。
<强>更新强>
为了暂停/恢复工作线程(以及滑块和歌曲),这里有一个设置适当标志的按钮示例。
private boolean isPaused = false;
JButton pause = new JButton("Pause");
pause.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton source = (JButton)e.getSource();
if (!isPaused) {
isPaused = true;
source.setText("Resume");
} else {
isPaused = false;
source.setText("Pause");
}
}
});
方法doInBackground
应该更改为:
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i <= duration; i++) {
if (!isPaused) {
publish(i);
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
while (isPaused) {
try {
Thread.sleep(50);
continue;
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
return null;
}
相应地修改它以暂停/恢复歌曲以及滑块。
您还应该考虑@ AndrewThompson的答案。