2016-02-17 2 views
1

У меня проблемы с моим приложением JavaFX. В настоящее время я создаю музыкальный плеер, и у меня есть слайдер внизу (аналогично Spotify), который должен двигаться в зависимости от продолжительности песни.FIXED - приложение приложения JavaFX при использовании Thread

Проблема в том, что мой код не работает при использовании этого кода Thread. Он получает текущую продолжительность песни, а затем устанавливает значение durationSlider перед сном на 1000 мс.

Кто-нибудь знает, как устранить эту проблему с задержкой? Код по-прежнему работает каждую секунду, но мой графический интерфейс отстает, и я совершенно ничего не могу сделать.

public void startCounting(){ 
    mediaPlayer.setOnPlaying(new Thread() { 
     @Override 
     public void run() { 
      Duration a; 
      while (mediaPlayer.getStatus().equals(MediaPlayer.Status.PLAYING)) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        System.out.println("Shit aint workin bro"); 
       } 
       a = mediaPlayer.getCurrentTime(); 
       int currentTime = (int) a.toSeconds(); 
       System.out.println(currentTime); 
       durationSlider.setValue(50.0); //Testing the setValue() method 

      } 
     } 
    }); 
} 

Редактировать: проблема устранена.

+0

Хорошо, я не могу проверить ваш код прямо сейчас, но в качестве предложения вам не следует обновлять пользовательский интерфейс из «Runnable», также неудобно, как ваш код не выдавал исключение. То, как вы подключили прослушиватель событий, является правильным, но вы должны изменить метод 'durationSlider.setValue (50.0);' для вызова из потока 'Platform.RunLater()' для обновления пользовательского интерфейса. Посмотрите аналогичное решение здесь http://stackoverflow.com/questions/13784333/platform-runlater-and-task-in-javafx – AntJavaDev

ответ

1

Вы в основном остановить свой UI нить, потому что onPlaying вызываются с помощью run метода, а не start метода Thread. Вместо этого вы должны передать Runnable, который создает новый Thread и называет start. Обратите внимание, что, как сказал @AntJavaDev, в этом случае все изменения в пользовательском интерфейсе должны быть выполнены с использованием Platform.runLater:

mediaPlayer.setOnPlaying(()-> { 
    Thread th = new Thread() { 
     @Override 
     public void run() { 
      Duration a; 
      while (mediaPlayer.getStatus().equals(MediaPlayer.Status.PLAYING)) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        System.out.println("Shit aint workin bro"); 
       } 
       a = mediaPlayer.getCurrentTime(); 
       int currentTime = (int) a.toSeconds(); 
       System.out.println(currentTime); 
       Platform.runLater(() -> durationSlider.setValue(50.0)); //Testing the setValue() method 

     } 
    }; 
    th.start(); 
}); 

Вы можете сохранить этот Thread экземпляр, так что вы можете взаимодействовать с ним в вашем onStopped и т.д., или, может быть, установите его как поток демона, поэтому он не блокирует закрытие программы.

+0

Спасибо! Это работает блестяще. – Kristianasp

Смежные вопросы