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

Другие вопросы по тегам