将一个mouseListener添加到Scala Swing ListView的最佳方法是,单击列表中的项目是否会创建一个PopupMenu,其中包含与该特定项目相关的选项?
我现在坚持使用Java样式代码执行此操作,或者自2.8.1以来Scala Swing已经进一步发展了
我目前收到的一些内容,也许我正在听错了,我正在查看ListView上的ScalaDocs。
lazy val ui = new FlowPanel {
val listView = ListView(items) {
renderer = Renderer(_.name)
listenTo(this.mouse.clicks)
reactions += {
case e: MouseClicked =>
// How do I determine what item was clicked?
}
}
}
答案 0 :(得分:1)
lazy val ui = new FlowPanel {
val listView = new ListView( Seq("spam", "eggs", "ham") )
listenTo(listView.selection)
reactions += {
case SelectionChanged(`listView`) => println(listView.selection.items(0))
}
contents += listView
}
这应该产生输出,如
spam
spam
eggs
eggs
ham
ham
点击各种项目。我之前从未这样做过,但我查看了UIDemo
包中可以找到的scala.swing.test
示例。要阅读源代码,如果您有IntelliJ,就像单击“项目”窗格中“外部库”中scala-swing.jar中的相关对象一样简单。
对于PopupMenu,我不知道 - 它看起来不像2.9.1中有一个scala-swing包装器,但我在GitHub here上找到了一个。或者您可以使用普通的Swing版本。
答案 1 :(得分:0)
这是令人无法接受的迟到,但我觉得有必要提供" java风格"任何可能感兴趣的人的解决方案(撇开我实施的具体细节,其实质是在'反应'):
val listView = new ListView[Int] {
selection.intervalMode = ListView.IntervalMode.Single
listData = (1 to 20).toList
listenTo(mouse.clicks)
reactions += {
case m : MouseClicked if m.clicks == 2 =>
doSomethingWith( listData(selection.anchorIndex) )
//where doSomethingWith is your desired result of this event
}
}
假设单一间隔模式,获取刚刚双击的列表项的关键是使用anchorIndex。