Всплывающее меню Scala Swing в ListView - PullRequest
4 голосов
/ 28 ноября 2011

Как лучше всего добавить mouseListener в Scala Swing ListView, чтобы при щелчке по любому элементу в списке создавалось PopupMenu с параметрами, относящимися к этому конкретному элементу, по которому щелкали?

Застрял ли я сейчас делать это с кодом в стиле Java или Scala Swing развился немного больше, начиная с 2.8.1

Немного того, что я получил в настоящее время, и, возможно, я слушаю не то иЯ перебираю ScalaDocs в ListView.

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 ]

1 голос
/ 28 ноября 2011
  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 здесь . Или вы можете просто использовать обычную версию Swing.

0 голосов
/ 12 июля 2013

Это недопустимо поздно, но я чувствую себя обязанным предложить решение "в стиле 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.

...