我正在用JMF构建纯Java视频播放器,并使用完全自定义的UI控件。一切都很好,直到我放入一个JLabel,它以hh:mm:ss.ss格式更新当前播放时间。标签更新可以接受,但偶尔会暂停10秒以上,这是不可接受的。在JMF视频播放期间更新视频控制UI时的并发问题
JMF Player
创建于SwingUtilities.invokeLater(new Runnable()...
块。下面是UI更新代码:
protected void createUIUpdater() {
System.out.println("Creating UI updating worker thread");
new Thread() {
@Override
public void run() {
while(mediaPlayer.getState() == Controller.Started) {
updatePlayPosition();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
System.err.println("Sleep interrupted!");
}
}
System.out.println("UI Updater thread finished.");
}
}.start();
}
protected void updatePlayPosition() {
Movie movie = timelineEditor.getMovie();
movie.setInsertionPoint(Rational.valueOf(mediaPlayer.getMediaTime().getSeconds()));
updateTimeLabel();
}
protected void updateTimeLabel() {
Movie movie = timelineEditor.getMovie();
Rational time = movie == null ? new Rational(0,1) : movie.getInsertionPoint();
// ... hours/minutes/seconds calculated
timeLabel.setText((hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes)
+ ":" + (seconds < 10 ? "0" + seconds : seconds)
+ "." + (frame < 10 ? "0" + frame : frame));
}
这就是所谓的ControllerListener
上StartEvent
。在此期间,音频/视频正在播放。
对于Java中的并发性,我承认有点新手,而且我确信有更好的方法来处理这个单独的线程。有什么建议么?
尝试调用标签invalidate,然后在每次更新后进行验证。 – roni 2012-03-08 19:52:51
问题不在于JLabel不重绘,而是线程似乎“挂起”。我在'updateTimeLabel()'中输入了一个sysout语句,当问题发生时,系统不会被调用。 – alalonde 2012-03-08 22:21:27