Как программно обновить Scala / Swing из внешнего класса? - PullRequest
1 голос
/ 06 сентября 2011

Например, следующий код показывает простую таблицу

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 "Price" со счетчиком i?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Когда вы говорите 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 и его экземпляр, либо создать черту Updatable, которую вы можете использовать в описании пользовательского интерфейса, делая ваш ui тип BoxPanel with Updatable, так что вы можете получить доступ к методу updateTable.

1 голос
/ 06 сентября 2011

Я не знаю Scala, но я знаю, что вы не можете sleep() в ветке рассылки событий. Для обновления вам необходим эквивалент 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)
    }
}
...