更新进度条

时间:2013-08-17 21:59:13

标签: java swing jframe event-dispatch-thread jprogressbar

我正在jframe中运行AudioInputStream。我在jframe上有一个进度条。我将jproggressbar命名为“bar”。我正在尝试获取进度条以跟踪AudioInputStream通过一首歌的距离。我尝试了一个循环,但是我尝试的每一种方式,循环最终使jframe冻结。然后,我无法完成其他任务,如关闭窗口或暂停AudioInputStream直到歌曲结束。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:5)

在某种程度上,您需要更新EDT中的进度条,并继续处理外部的流。一种方法是使用SwingWorker。您需要在doInBackground()中进行处理,并使用publish()更新进度。或者,您可以滚动自己的线程,并在需要更新进度条时使用SwingUtilities.invokeLater()

答案 1 :(得分:1)

我发现循环必须在与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());
                             }
                  }
       }
}