【问题标题】:How do I update a Scala/Swing programmatically from an external class?如何从外部类以编程方式更新 Scala/Swing?
【发布时间】:2011-11-11 02:07:37
【问题描述】:

例如下面的代码展示了一个简单的表格

import java.awt.Dimension
import swing._

object SunsetTable extends SimpleSwingApplication {

  var model = Array(List("BHP", 1).toArray)

  lazy val ui = new BoxPanel(Orientation.Vertical) {
    val table = new Table(model, Array("Security", "Price")) {
      preferredViewportSize = new Dimension(1200, 600)
    }
    contents += new ScrollPane(table)
  }

  def top = new MainFrame {
    contents = ui
  }

}

假设我有一个外部类

class Counter {
    for (i <- 1 to 10) {
        // update SunsetTable with i
        Thread.sleep(1000)
    }
}

如何使用计数器 i 更新 SunsetTable“价格”列?

【问题讨论】:

    标签: java swing scala scala-swing


    【解决方案1】:

    当您说lazy val ui = new BoxPanel(Orientation.Vertical) { ... } 时,您正在对 BoxPanel 类进行新的匿名扩展。 ui 是 BoxPanel,因此只有公共 BoxPanel 成员在外部范围内可见。

    解决此问题的一种方法是将 table 的声明移到 BoxPanel 之外,使其成为 SunsetTable 的字段。那你可以说

    SunsetTable.table.update(0,0,"ABC")
    

    你也可以让你的代码保持原样

    SunsetTable.ui.contents(0).asInstanceOf[ScrollPane].contents(0)
     .asInstanceOf[Table].update(0,0,"ABC")
    

    最后,您可以声明一个扩展 BoxPanel 并包含 updateTable 方法的新类,并创建 ui 及其实例,或者创建可在 ui 声明中使用的 Updatable 特征,使你的ui 输入BoxPanel with Updatable,这样你就可以访问updateTable 方法了。

    【讨论】:

      【解决方案2】:

      我不了解 Scala,但我知道您不能在事件调度线程上 sleep()。您需要与 continuation 等效的 Scala 来进行更新。

      class Counter {
          for (i <- 1 to 10) {
              // begin Java
              EventQueue.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      // update SunsetTable with i
                  }
              });
              // end Java
              Thread.sleep(1000)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-06
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 2015-06-10
        相关资源
        最近更新 更多