2011-09-06 42 views
1

例如下面的代碼顯示了一個簡單的表格如何從外部類以編程方式更新Scala/Swing?

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「價格」列?

回答

2

當你說lazy val ui = new BoxPanel(Orientation.Vertical) { ... }你正在對BoxPanel類做一個新的匿名擴展。 ui是一個BoxPanel,因此只有公共BoxPanel成員在外部範圍內可見。

解決此問題的一種方法是將Box的外部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以及這種情況的實例,或者使您可以在ui聲明中使用的Updatable特徵,使您的ui類型BoxPanel with Updatable,因此您可以訪問updateTable方法。

1

我不知道斯卡拉,但我知道你不能在事件調度線程上使用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) 
    } 
}