随着视频的进展,JSlider旋钮不会更新

时间:2013-07-07 11:42:46

标签: java swing slider event-dispatch-thread vlcj

这是我更新jslider的代码

    try{
    name=(String) jList1.getSelectedValue();
    CanvasVideoSurface videoSurface = mediaPlayerFactory.newVideoSurface(canvas1);
    mediaPlayer.setVideoSurface(videoSurface);
    mediaPlayer.setAdjustVideo(true);        
    mediaPlayer.playMedia(name+".mp4");
    mediaPlayer.setVolume(jSlider1.getMinimum());
    mediaPlayer.parseMedia();
    time = (int)(mediaPlayer.getMediaMeta().getLength()/1000);
    jSlider2.setMaximum(time);
    while(jSlider2.getValue()<jSlider2.getMaximum())
    {
      jSlider2.setValue((int) this.mediaPlayer.getTime()/1000);
     }
    }
    catch(Exception e)
    {
     e.printStackTrace();
    }

并且对于滑块的更改状态,这是代码

 private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt)
 {                                      
 mediaPlayer.setTime((long) this.jSlider2.getValue());
}                                     

但是它并没有改变nob的位置,事实上它继续从重新开始再次播放。我认为原因是setTime()函数在jslider可以获取新值之前保持更新为0。有什么解决方案吗? ?也许使用线程? 谢谢!

1 个答案:

答案 0 :(得分:1)

使用此代码:

while(jSlider2.getValue() < jSlider2.getMaximum())
{
  jSlider2.setValue((int) this.mediaPlayer.getTime()/1000);
}

你在Swing E 发泄 D ispatch T hread或EDT上调用一个长时间循环的循环,这会冻结你的GUI防止所有绘画。考虑在SwingWorker的doInBackground方法中运行后台进程,然后通过SwingWorker的发布/进程方法对更新GUI。此外,如果您要轮询媒体播放器,请考虑在轮询循环中放入Thread.sleep(/* some number */),因为几乎不间断地进行轮询是没有意义的。

有关详情,请查看Concurrency in Swing