Я знаю, что этот вопрос два года, но я думаю, что стоит обновить с другим ответом. Вот мое решение:
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)
Некоторые вещи, чтобы отметить:
- Использование класса SuperMixin, как рекомендовано в scala-swing-design.pdf, в разделе «Руководство по Writing Wrappers ", подраздел« Использование кэша обертки ».
- Mixin scala.swing.SequentialContainer.Wrapper, так что я могу использовать конструкцию
contents +=
, поэтому код Popup Menu выглядит как другой код построения Scala-Swing.
- Хотя вопрос использует
JPopupMenu.setVisible
, я думаю, что вы захотите обернуть и использовать метод JPopupMenu.show
, чтобы вы могли управлять расположением всплывающего меню. (Просто установив его для отображения, он помещает его в верхний левый угол экрана для меня.)
Почему это (всплывающее меню) не входит в стандартный набор инструментов Scala Swing? Я должен сказать, что меня немного встревожило отсутствие документации вместе с некоторыми довольно базовыми конструкциями. Заставляет меня задаться вопросом, действительно ли кто-то использует набор инструментов. –
oxbow, да, люди действительно используют scala-swing. Отсутствие документации не удивительно. Стоимость/выгода просто не заканчивается, так как большинство методов в scala-swing - простые простые сопоставления методам Java Swing. Я бы не стал рассматривать JPopupMenu как «базовую конструкцию», и, хотя это немного вопиющий надзор, примите во внимание объем усилий, связанных с упаковкой всех возможных компонентов Swing. В пакетах scala.swing и scala.swing.event имеется более 100 классов. –
Я знаю, что этот ответ два года, но метод PopupMenu.setVisible не нужен. Когда вы наследуете метод 'Component.visible_ =', вы уже можете сказать 'popup.visible = true'. –