【问题标题】:Canonical way to monitor the status of a thread监控线程状态的规范方法
【发布时间】:2012-05-05 23:52:04
【问题描述】:

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

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

【问题讨论】:

标签: java swing scala concurrency progress-bar


【解决方案1】:

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

【讨论】:

  • addPropertyChangeListener 是 java.awt.Component 的成员,我正在寻找一种不使用 GUI 库的方法。
【解决方案2】:

通过使用 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()
    }
  })
}

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多