ListView上的Scala Swing弹出菜单

时间:2011-11-28 00:28:24

标签: swing scala

将一个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?
        }
    }
}

2 个答案:

答案 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。