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

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

最佳答案

当您说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,以便可以访问updateTable方法。

09-26 12:07