1

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

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“价格”列?

4

2 回答 2

2

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

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

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

你也可以保持你的代码原样并说

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

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

于 2011-09-06T11:22:46.050 回答
1

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

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)
    }
}
于 2011-09-06T11:02:46.660 回答