2012-05-05 50 views
2

我正在使用Scala在Swing中編寫GUI應用程序,該應用程序啓動多個線程以同時通過HTTP下載文件。我想用一些JProgressBar來顯示下載的狀態。顯然,進度條必須從事件派發線程更新,此外,我想保持HTTP下載代碼與GUI分開。典型的監控線程狀態的方法

我想知道做這件事的最好方法是什麼? SwingWorker是Swing特有的,並且Observable看起來有些陳舊,因爲傳遞給觀察者的參數是一個對象並且必須被施放。斯卡拉是一個強大的現代語言,所以我希望有一個更簡單的方法來做我想做的事情。

+1

的(HTTP [在Java下載過程JProgressBar的連接]可能重複:// stackoverflow.com/questions/9420778/connect-jprogressbar-with-download-process-in-java)和[使用現有JProgressBar的Java ProgressMonitorInputStream](http://stackoverflow.com/questions/8379398/java-progressmonitorinputstream-using- existing-jprogressbar) – jtahlborn

回答

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() 
    } 
    }) 
} 
2

讓您下載的類接受您通知的關於下載進度的PropertChangeListener。監聽器相應地更新進度條。

+0

addPropertyChangeListener是java.awt.Component的成員,我正在尋找一種不使用GUI庫的方法。 –