我正在使用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()
}
})
}