scala:double"选择已更改"为ListView组件引发的事件

时间:2013-12-07 21:52:48

标签: scala events 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被调用了两次。

感谢。

1 个答案:

答案 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它将对应按键,但它也会过滤关键事件。就像我说的。一点都不好......