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)
    }
}

SunsetTableの「価格」列をカウンターiで更新するにはどうすればよいですか?

4

2 に答える 2

2

lazy val ui = new BoxPanel(Orientation.Vertical) { ... }BoxPanel クラスに新しい匿名拡張を作成していると言うとき。uiは BoxPanel であるため、パブリック BoxPanel メンバーのみが外側のスコープで表示されます。

これを回避する 1 つの方法は、BoxPanel の外側に宣言を移動してtable、それが 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

sleep()Scala はわかりませんが、イベント ディスパッチ スレッドではできないことはわかっています。更新を行うには、継続に相当する 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)
    }
}
于 2011-09-06T11:02:46.660 に答える