2011-11-28 63 views
4

向Scala Swing ListView中添加mouseListener的最佳方式是點擊列表中的任何項目將創建一個PopupMenu,其中包含與被點擊的特定項目有關的選項上?ListView上的Scala Swing彈出式菜單

我是堅持了與Java代碼風格做這個現在還是有斯卡拉鞦韆發展多一點,因爲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? 
     } 
    } 
} 
+0

另請參閱此問題的答案:http://stackoverflow.com/questions/938753/scala-popup-menu –

+0

是啊,這幾乎是我現在正在做的。但是,這是我所說的「Java感覺」。無論如何,它適用於我正在做的事情。^_^ – digicyc

回答

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示例。要閱讀源代碼,如果你有IntelliJ,就像在Projects窗格的External Libraries中的scala-swing.jar中單擊相關對象一樣簡單。

至於PopupMenu,我不知道 - 它看起來不像是在2.9.1中有一個scala-swing包裝,但我在GitHub here上找到了一個。或者你可以使用普通的Swing版本。

+0

完美。謝謝你的作品完全如圖所示。我還評論了這個拉取請求,希望它能推動任何事情。 – digicyc

+0

爲什麼事件會爲單個選擇啓動兩次?試圖找出這個...... –

+0

@ZakPatterson當你選擇它時你會得到一個事件,當你在該項目上釋放鼠標按鈕時你會得到一個。所以如果你按下「垃圾郵件」上的鼠標按鈕,然後將指針滑過「雞蛋」,然後釋放你將獲得輸出「垃圾蛋蛋」。 –

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。