要在JavaFX中创建Popupmenu,可以使用ContextMenu类。
您向其中添加MenuItems,也可以使用SeparatorMenuItem创建可视分隔符。
在下面的示例中,我选择子类ContextMenu并将MenuItems添加到其构造函数中。
public class AnimationPopupMenu extends ContextMenu{
public AnimationPopupMenu()
{
(...)
getItems().addAll(
MenuItemBuilder.create()
.text(ADD_PARTICLE)
.graphic(createIcon(...))
.onAction(new EventHandler() {
@Override
public void handle(ActionEvent actionEvent) {
// some code that gets called when the user clicks the menu item
}
})
.build(),
(...)
SeparatorMenuItemBuilder.create().build(),
MenuItemBuilder.create()
.text(ADD_DISTANCE_MEASURER)
.onAction(new EventHandler() {
@Override
public void handle(ActionEvent actionEvent) {
// Some code that will get called when the user clicks the menu item
}
})
.graphic(createIcon(...))
.build(),
(...)
);
}
- 第5行:我获得了ContextMenu的子级Collection,并调用addAll添加MenuItems。
- 第6行:使用MenuItem构建器创建MenuItem;
- 第7行:传入菜单项的文本。 变量ADD_PARTICLE等于“添加粒子”;
- 第8行:调用图形,该图形接收createIcon返回的菜单项图标:
ImageView createIcon(URL iconURL) { return ImageViewBuilder.create() .image(new Image(iconURL.toString())) .build(); }
- 第9行:onAction接收事件处理程序,该事件处理程序将在用户单击菜单项时调用;
- 第15行:最后,通过在MenuItemBuilder类上执行build()创建MenuItem;
- 第18行:创建分隔符,您可以在本文开头的图中看到该分隔符。 这是“添加原点”和“添加距离测量器”之间的虚线;
- 其他代码行仅重复相同的过程即可创建其余菜单项。
在JFXPanel中使用JavaFX弹出菜单
如果将JavaFX场景嵌入到Swing应用程序中,则必须手动执行一些额外的步骤,否则,弹出菜单上将没有悬停动画,并且当用户单击外部时不会自动将其关闭它的。 为此有一个针对JavaFX 3.0的修复程序– http://javafx-jira.kenai.com/browse/RT-14899 首先,您必须要求将焦点集中在javafx容器上,以便弹出窗口获得悬停动画,并且当您在应用程序窗口外单击时,将其关闭。 就我而言,我在弹出菜单的构造函数上传递了对javafx swing容器的引用,然后我覆盖了ContextMenu的show方法,以便在实际显示弹出窗口之前请求将焦点放在swing容器上:
public void show(Node anchor, MouseEvent event)
{
wrapper.requestFocusInWindow();
super.show(anchor, event.getScreenX(), event.getScreenY());
}
最后,当用户在javafx场景内但在弹出窗口之外单击时,您还必须通过调用hide()来关闭弹出窗口。
我几乎忘了..感谢Martin Sladecek(Oracle JavaFX团队)为我提供了一些建议。
参考:来自JCG合作伙伴的 JavaFX 2中的PopupMenu Pixel Duke博客上的Pedro Duque Vieira。
翻译自: https://www.javacodegeeks.com/2012/02/popupmenu-in-javafx-2.html