为媒体播放器制作搜索栏。

我正在使用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; 

这是代码。 现在我该如何让滑块与歌曲一起移动? 当我拖动/点击它时滑块工作,但它不随着歌曲移动。

使用滑块的问题是,当以编程方式移动滑块位置时,它会触发事件。 在滑块上触发事件时,通常表示应用程序。 必须做点什么,比如移动歌曲位置。 效果是一个永无止境的循环。 通过设置标志并忽略某些事件,可能有办法解决这个问题,但我决定采用不同的方式。

相反,我使用JProgressBar来指示轨道中的位置,并使用MouseListener来检测用户何时单击一个单独的位置。 使用Swing Timer更新进度条,每隔50-200毫秒检查一次轨道位置。 检测到MouseEvent时,重新定位轨道。

该栏位于此GUI的右上角。 将鼠标hover在它上面会产生一个工具提示,显示该鼠标位置的轨道时间。

Duke Box使用进度条进行赛道位置

你可以使用JSlider。

您可以从Slider教程中了解更多信息

滑块教程

您无需revalidate容器即可更改滑块。

每次创建新玩家时都使用这些行:

  slider.setMinimum(0); slider.setMaximum(duration); slider.setValue(0); new UpdateWorker(duration).execute(); 

其中duration是保持歌曲duration的变量,以秒为单位。

以下是更新滑块的代码(用作内部类):

 private class UpdateWorker extends SwingWorker { 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 chunks) { slider.setValue(chunks.get(0)); } } 

现在滑块将向右移动直到歌曲结束。

另请注意,除非您想使用自定义滑块,否则JMF会通过player.getVisualComponent()提供一个简单(且工作)的滑块(请参阅此示例 )。

UPDATE

为了暂停/恢复工作线程(以及滑块和歌曲),下面是一个带有设置适当标志的按钮的示例。

 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的答案。