2

私はScalaを使用してSwingでGUIアプリケーションを作成しています。このアプリケーションは、複数のスレッドを開始してHTTP経由でファイルを同時にダウンロードします。JProgressBarいくつかのを使用して、ダウンロードのステータスを表示したいと思います。もちろん、プログレスバーはイベントディスパッチスレッドから更新する必要があります。さらに、HTTPダウンロードコードをGUIとは別にしたいと思います。

これを行うための最良の方法は何でしょうか?SwingWorkerはSwing固有でありObservable、オブザーバーに渡されるパラメーターがオブジェクトであり、キャストする必要があるという点で、やや古風なようです。Scalaは強力な現代語なので、自分がやりたいことをもっと簡単に行う方法があることを望んでいました。

4

2 に答える 2

2

ダウンロードするクラスに、ダウンロードの進行状況について通知するPropertChangeListenerを受け入れさせます。リスナーはそれに応じてプログレスバーを更新します。

于 2012-05-06T00:33:07.813 に答える
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()
    }
  })
}
于 2012-05-06T23:20:19.847 に答える