Я создаю видеоплеер на чистом Java с использованием JMF с полностью настраиваемыми элементами управления пользовательским интерфейсом.Все работало отлично, пока я не вставил JLabel, который обновляет текущее время воспроизведения в формате чч: мм: сс.сс.Ярлык обновляется приемлемо, но иногда останавливается на 10+ секунд за раз, что недопустимо.
JMF Player
создается в блоке SwingUtilities.invokeLater(new Runnable()...
.Вот код обновления пользовательского интерфейса:
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, и я уверен, что есть лучший способ обработки этого отдельного потока.Есть предложения?