2013-12-07 2 views
1

здесь является частью кода:Scala: двойной «Выбор изменилось» событие, которое возникает для ListView компонента

val lsv_syns = new ListView[String]() 
val scp_syns = new ScrollPane() { 
    listenTo(lsv_syns.mouse.moves,lsv_syns.selection) 
    reactions += { 
     case me: MouseExited => { 
      txf_mot.requestFocus() 
     } 
     case SelectionChanged(`lsv_syns`)=> { 
      println("sélection:"+lsv_syns.selection.items(0)) 
     } 
    } 
} 

Как вы можете видеть, ListView находится в ScrollPane; не обращайте внимание на событие mouseExited, интересной является selectionChanged, которая, кажется, вызывается дважды, когда я нажимаю только на время в другой строке, потому что println вызывается два раза.

спасибо.

+0

Можете ли вы сделать это самодостаточным примером? –

ответ

3

Ну, я также недавно работал с ListView, и теперь, когда вы упомянули об этом, он также выполняет мой расчет дважды.

Ответ, похоже, связан с событиями мыши. После трассировки стека SelectionChanged вызывается дважды. Один из событий Java MousePressed и один от MouseReleased. Когда вы меняете выделение с помощью KeyEvents, он вызывается только один раз.

Мой первый (и я думаю, не красиво) идея, чтобы избежать этой проблемы было бы игнорировать одно из событий:

reactions += { 
    case SelectionChanged(`lsv_syns`) if !lsv_syns.selection.adjusting => { 
     println("sélection:"+lsv_syns.selection.items(0)) 
    } 
} 

Оба ListSelection события одни и те же данные, за исключением getValueIsAdjusting. Поэтому, если вы проверите это, вы можете дважды делать свое дело дважды.

Предупреждение: !lsv_syns.selection.adjusting приведет к печати при отпускании ключа, а не при нажатии! Если вы положили lsv_syns.selection.adjusting, он будет соответствовать нажатию клавиши, но также будет фильтровать ключевые события. Как я сказал. Не очень приятно ...

+1

Вам не нужно прибегать к слушателям Java. Если проверка значения делает это для вас, вы должны быть в порядке с 'case SelectionChanged (' lsv_syns'), если! Lsv_syns.selection.adjusting => ... ' –

+0

Вы правы. Думал, что это значение будет храниться только в этом случае. Обновлено. – Kigyo

+0

спасибо Kigyo, он работает. – lolveley

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