0

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

4

2 回答 2

5

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

于 2013-08-17T22:06:03.767 回答
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());
                             }
                  }
       }
}
于 2014-12-17T16:36:24.927 回答