scala, swing: проблема в потоке рассылки событий (актеры)
У меня есть класс Scala, наследующий от SimpleSwingApplication. Этот класс определяет окно (с def top = new MainFrame
) и создает актера. код актера прост:
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)
}
}
}
}
}
и основной класс использует также "вещество", API, позволяющий настраивать графический интерфейс (с ним больше нет уродливых элементов управления свингом!).
актер вызывается, когда я покидаю заданный стол качания с помощью мыши; тогда актер вызывается и отменяет выбор всех строк таблицы. актер ведет себя очень хорошо, но когда я запускаю свою программу, каждый раз, когда актер вызывается, я получаю следующее сообщение об ошибке:
org.pushingpixels.substance.api.UiThreadingViolationException: отслеживание состояния должно выполняться в потоке отправки событий
Вы знаете, как я могу удалить это сообщение об ошибке?
1 ответ
Вам нужно переместить обновление графического интерфейса на 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