-->

为使媒体播放器搜索栏。(Make a seek bar for media player. )

2019-08-01 06:30发布

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

下面是代码。 现在,我怎样才能使伴随着歌曲滑块移动? 滑块的作品,当我拖动/点击它,但它不与歌移动。

Answer 1:

使用这个滑块的问题是,当滑块位置编程移动,它触发事件。 当事件被在滑块上烧制时,它通常意味着应用程序。 有做一些事情,比如移动乐曲位置。 其效果是永无止境的循环。 有可能是解决的办法通过设置标志,而忽略了一些事件,但我决定去一个不同的方式。

相反,我使用JProgressBar以指示在磁道中的位置,和一个MouseListener到当用户点击在一个单独的位置检测。 更新进度条使用Swing的Timer ,检查轨道位置每50-200毫秒。 当MouseEvent被检测到,重新定位的轨道。

酒吧可以在此界面的右上角可以看到。 盘旋在它会产生一个刀头表示在该鼠标位置的轨道的时间。



Answer 2:

你可以使用一个JSlider的。

你可以学到更多的滑块教程



Answer 3:

您不必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()见这个例子 )。

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



文章来源: Make a seek bar for media player.
标签: java swing jmf