2

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

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

4

2 回答 2

2

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

于 2012-05-06T00:33:07.813 回答
0

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

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()
    }
  })
}
于 2012-05-06T23:20:19.847 回答