scala,swing:Event Dispatch Thread(演员)的线程问题

时间:2013-12-16 12:35:14

标签: scala event-dispatch-thread scala-swing

我有一个继承自SimpleSwingApplication的scala类。这个类定义了一个窗口(带有def top = new MainFrame)并实例化了一个actor。演员的代码很简单:

class Deselectionneur extends Actor {

def act() {
    while (true) {
        receive {
            case a:sTable => {
                Thread.sleep(3000)
                a.peer.changeSelection(0,0,false,false)
                a.peer.changeSelection(0,0,true,false)
            }
        }
    }
}

}

并且主类也使用“实体”,一个允许gui自定义的API(没有更难看的摇摆控件!)。

当我用鼠标离开给定的摇摆桌时,演员被召唤;然后演员被称为&取消选择表的所有行。 演员表现得非常好,但是当我启动我的程序时,每次调用actor时,都会收到以下错误消息:

  

org.pushingpixels.substance.api.UiThreadingViolationException:状态跟踪必须在事件调度线程上完成

您知道如何删除此错误消息吗?

1 个答案:

答案 0 :(得分:2)

您需要将gui更新移至EDT

类似的东西(我没有编译过)

case a:sTable => {
  scala.swing.Swing.onEDT {
    Thread.sleep(3000)  // this will stop GUI updates
    a.peer.changeSelection(0,0,false,false)
    a.peer.changeSelection(0,0,true,false)
  }
}

有关EDT的一些背景信息,请访问:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html