这是代码的一部分:
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
它将对应按键,但它也会过滤关键事件。就像我说的。一点都不好......