2009-06-02 69 views
3

如何讓彈出窗口在斯卡拉顯示?我有一個「後門」,但它看起來很醜對我說:斯卡拉彈出式菜單

val item = new MenuItem(new Action("Say Hello") { 
    def apply = println("Hello World"); 
}) 
//SO FAR SO GOOD, NOW FOR THE UGLY BIT! 
val popup = new javax.swing.JPopupMenu 
popup.add(item.peer) 
popup.setVisible(true) 

回答

4

你在做什麼是好的,但如果你想隱藏對等方呼叫,你可以創建自己的類:

class PopupMenu extends Component 
{ 
    override lazy val peer : JPopupMenu = new JPopupMenu 

    def add(item:MenuItem) : Unit = { peer.add(item.peer) } 
    def setVisible(visible:Boolean) : Unit = { peer.setVisible(visible) } 
    /* Create any other peer methods here */ 
} 

然後你可以使用它像這樣:

val item = new MenuItem(new Action("Say Hello") { 
    def apply = println("Hello World"); 
}) 

val popup = new PopupMenu 
popup.add(item) 
popup.setVisible(true) 

作爲替代方案,你可以嘗試SQUIB(Scala的新奇的用戶界面生成器)。隨着SQUIB,上面的代碼變成:

popup(
    contents(
    menuitem(
     'text -> "Say Hello", 
     actionPerformed(
     println("Hello World!") 
    ) 
    ) 
) 
).setVisible(true) 
+0

爲什麼這個(彈出菜單)不是標準scala swing工具包的一部分?我必須說,由於缺乏文檔以及一些非常基本的構造,我感到有點驚慌。讓我懷疑是否有人實際使用該工具包。 – 2009-06-03 07:12:45

6

我知道這個問題是兩歲,但我認爲這是值得與另一個答案更新。這裏是我的解決方案:

import javax.swing.JPopupMenu 
import scala.swing.{ Component, MenuItem } 
import scala.swing.SequentialContainer.Wrapper 

object PopupMenu { 
    private[PopupMenu] trait JPopupMenuMixin { def popupMenuWrapper: PopupMenu } 
} 

class PopupMenu extends Component with Wrapper { 

    override lazy val peer: JPopupMenu = new JPopupMenu with PopupMenu.JPopupMenuMixin with SuperMixin { 
    def popupMenuWrapper = PopupMenu.this 
    } 

    def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y) 

    /* Create any other peer methods here */ 
} 

下面是一些示例使用代碼:

val popupMenu = new PopupMenu { 
    contents += new Menu("menu 1") { 
    contents += new RadioMenuItem("radio 1.1") 
    contents += new RadioMenuItem("radio 1.2") 
    } 
    contents += new Menu("menu 2") { 
    contents += new RadioMenuItem("radio 2.1") 
    contents += new RadioMenuItem("radio 2.2") 
    } 
} 
val button = new Button("Show Popup Menu") 
reactions += { 
    case e: ButtonClicked => popupMenu.show(button, 0, button.bounds.height) 
} 
listenTo(button) 

需要注意以下幾點:

  1. 使用SuperMixin類爲scala-swing-design.pdf建議,在一節「爲指導方針寫入包裝器「小節」使用包裝器高速緩存器「。
  2. Mixin scala.swing.SequentialContainer.Wrapper,這樣我就可以使用contents +=構造,所以我的彈出菜單代碼看起來像其他的scala-swing菜單構造代碼。
  3. 雖然問題使用JPopupMenu.setVisible,我想你會打算使用方法JPopupMenu.show,所以你可以控制彈出菜單的位置。 (只要將它設置爲可見就會將它放在屏幕的左上角)