Обновление jprogress-бара

Я запускаю AudioInputStream в jframe. У меня есть индикатор выполнения на jframe. Я назвал jprogressbar «баром». Я пытаюсь заставить индикатор выполнения отслеживать, как далеко AudioInputStream проходит через песню. Я пробовал цикл, но каждый раз, когда я его пробовал, цикл заканчивался зависанием jframe. Затем я не могу выполнять другие задачи, такие как закрытие окна или приостановка AudioInputStream, пока песня не закончится. Может ли кто-нибудь помочь мне?


person Alan Sorrill    schedule 17.08.2013    source источник


Ответы (2)


Так или иначе вам нужно обновить индикатор выполнения в EDT и продолжить обработку потока вне EDT. Один из способов сделать это — использовать SwingWorker. Вы бы выполнили обработку в doInBackground() и обновили прогресс в publish(). В качестве альтернативы вы можете создать свою собственную поточность и использовать SwingUtilities.invokeLater(), когда вам нужно обновить индикатор выполнения.

person kiheru    schedule 17.08.2013

Я узнал, что цикл должен быть реализован в потоке, отличном от JFrame. как в,

public class Window extends JFrame{
       public int getMusicPosition(){
                  //get the music positional value and return it
       }

       public Window(){
                  new Thread(new BarUpdater()).start();
       }

       public class BarUpdater implements Runnable{
                  public void run(){
                             while(true){
                                        bar.setValue(getMusicPosition());
                             }
                  }
       }
}
person Alan Sorrill    schedule 17.12.2014