我正在使用Scala在Swing中编写一个GUI应用程序,它启动多个线程以同时通过HTTP下载文件。我想使用一些JProgressBar
来显示下载的状态。显然,必须从事件调度线程更新进度条,此外,我希望将HTTP下载代码与GUI分开。
我想知道最好的方法是什么? SwingWorker
特定于Swing,而Observable
似乎有些过时,因为传递给观察者的参数是一个对象,必须进行转换。 Scala是一种强大的现代语言,所以我希望有一种更简单的方法来做我想做的事。
答案 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()
}
})
}