2013-12-16 4 views
1

У меня есть класс scala, наследующий от SimpleSwingApplication. Этот класс определяет окно (с def top = new MainFrame) и инициирует актера. код актера прост:scala, swing: thread issue with Event Dispatch Thread (актеры)

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: отслеживание состояния должно быть сделано на событие Dispatch Thread

Знаете ли вы, как я могу удалить это сообщение об ошибке?

ответ

2

Вам нужно переместить обновления графического интерфейса на 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

+0

правильно Синтаксис - это 'scala.swing.Swing.onEDT {...' .thanks много! – lolveley

+0

Спасибо lolveley, я исправил пример – andy

Смежные вопросы