规范方式来监视线程的状态

时间:2012-05-05 23:52:04

标签: java swing scala concurrency progress-bar

我正在使用Scala在Swing中编写一个GUI应用程序,它启动多个线程以同时通过HTTP下载文件。我想使用一些JProgressBar来显示下载的状态。显然,必须从事件调度线程更新进度条,此外,我希望将HTTP下载代码与GUI分开。

我想知道最好的方法是什么? SwingWorker特定于Swing,而Observable似乎有些过时,因为传递给观察者的参数是一个对象,必须进行转换。 Scala是一种强大的现代语言,所以我希望有一种更简单的方法来做我想做的事。

2 个答案:

答案 0 :(得分:2)

让您下载的类接受您通知有关下载进度的PropertChangeListener。监听器相应地更新进度条。

答案 1 :(得分:0)

通过使用Scala闭包实现我自己的侦听器回调系统,我实现了我想要的。以下代码位于Download类:

val listeners = new ListBuffer[Int => Unit]

def registerListener(f: Int => Unit) {
  if (!listeners.contains(f)) {
    listeners.append(f)
  }
}

这是在GUI中嵌套的SwingWorker中进行的:

downloader.registerListener(this.listener)

def listener(progress: Int) {
  SwingUtilities.invokeLater(new Runnable {
    def run() {
      progressBar.setValue(progress)
      table.repaint()
    }
  })
}