监视线程状态的规范方法



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

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

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

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

val listeners = new ListBuffer[Int => Unit]
def registerListener(f: Int => Unit) {
  if (!listeners.contains(f)) {
    listeners.append(f)
  }
}

这在GUI中的嵌套SwingWorkers中:

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

最新更新