【问题标题】:Scala Swing Popup menu on ListViewListView 上的 Scala Swing 弹出菜单
【发布时间】:2013-07-12 06:30:01
【问题描述】:

将 mouseListener 添加到 Scala Swing ListView 的最佳方法是什么,只要单击列表中的任何项目,它都会创建一个 PopupMenu,其中包含与单击的特定项目相关的选项?

我现在是坚持使用 Java 样式代码还是 Scala Swing 自 2.8.1 以来发展得更多

我目前得到的一些信息,也许我听错了,正在查看 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?
        }
    }
}

【问题讨论】:

标签: swing scala


【解决方案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,只需在 Projects 窗格的 External Libraries 中单击 scala-swing.jar 中的相关对象即可。

至于 PopupMenu,我不知道 - 它看起来不像 2.9.1 中的 scala-swing 包装器,但我在 GitHub here 上找到了一个。或者你可以使用普通的 Swing 版本。

【讨论】:

  • 完美。谢谢你,这完全如图所示。我还评论了那个拉取请求,希望它能推动任何东西。
  • 为什么一次选择会触发两次事件?试图解决这个问题......
  • @ZakPatterson 当你选择它时你会得到一个事件,当你在该项目上释放鼠标按钮时会得到一个事件。因此,如果您在“垃圾邮件”上按住鼠标按钮,然后将指针滑到“鸡蛋”上,然后松开,您将得到输出“垃圾邮件鸡蛋”。
【解决方案2】:

这是不可接受的迟到,但我觉得有必要为任何可能感兴趣的人提供“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。

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多