要在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() {@Overridepublic 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() {@Overridepublic 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