Scala弹出菜单

时间:2009-06-02 09:59:10

标签: swing scala popup

如何在Scala中显示弹出窗口?我有一个“后门”,但对我来说似乎很难看:

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)

2 个答案:

答案 0 :(得分: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. 使用scala-swing-design.pdf中建议的SuperMixin类,“编写包装指南”,“使用包装器缓存”小节。
  2. Mixin scala.swing.SequentialContainer.Wrapper以便我可以使用contents +=构造,因此我的弹出菜单代码看起来像其他scala-swing菜单构造代码。
  3. 虽然问题使用JPopupMenu.setVisible,但我认为您将要包装并使用方法JPopupMenu.show,因此您可以控制弹出菜单的位置。 (只是将其设置为可见,将它放在屏幕的左上角。)

答案 1 :(得分: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的Quirky User Interface Builder)。使用SQUIB,上面的代码变为:

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