普通菜单
@Overridepublic void start(Stage primaryStage) throws Exception {AnchorPane an = new AnchorPane();an.setStyle("-fx-background-color:#ffffff");MenuBar menuBar = new MenuBar();Menu menu1 = new Menu("Menu1");Menu menu2 = new Menu("Menu2");Menu menu3 = new Menu("Menu3");Menu menu4 = new Menu("Menu4");MenuItem item1 = new MenuItem("MenuItem1");MenuItem item2 = new MenuItem("MenuItem2");MenuItem item3 = new MenuItem("MenuItem3");MenuItem item4 = new MenuItem("MenuItem4");menu1.getItems().addAll(item1,item2,item3,item4);menuBar.getMenus().addAll(menu1,menu2,menu3,menu4);//menu1.setOnShown();//监听菜单栏显示//menu1.setOnHidden();//监听菜单栏隐藏item1.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {//监听点击}});an.getChildren().addAll(menuBar);Scene scene = new Scene(an);primaryStage.setScene(scene);primaryStage.setHeight(400);primaryStage.setWidth(400);primaryStage.show();}
菜单之间添加分割线(SeparatorMenuItem
SeparatorMenuItem separatorMenuItem = new SeparatorMenuItem();//菜单栏间的分割线MenuBar menuBar = new MenuBar();Menu menu1 = new Menu("普通菜单");//普通菜单MenuItem item1 = new MenuItem("MenuItem1");MenuItem item2 = new MenuItem("MenuItem2");MenuItem item3 = new MenuItem("MenuItem3");menu1.getItems().addAll(item1,separatorMenuItem,item2,item3);
在菜单项上显示控件
SeparatorMenuItem separatorMenuItem = new SeparatorMenuItem();//菜单栏间的分割线MenuBar menuBar = new MenuBar();Menu menu = new Menu("普通菜单");//普通菜单MenuItem item1 = new MenuItem("MenuItem1");MenuItem item2 = new MenuItem("MenuItem2");MenuItem item3 = new MenuItem("MenuItem3");//将一个按钮嵌在Item中CustomMenuItem item4 = new CustomMenuItem();Button button = new Button("button");item4.setContent(button);menu.getItems().addAll(item1,separatorMenuItem,item2,item3,item4);
单选菜单
Menu menu2 = new Menu("单选菜单");//单选菜单ToggleGroup tg = new ToggleGroup();RadioMenuItem rmi1 = new RadioMenuItem("RadioItem1");RadioMenuItem rmi2 = new RadioMenuItem("RadioItem2");RadioMenuItem rmi3 = new RadioMenuItem("RadioItem3");RadioMenuItem rmi4 = new RadioMenuItem("RadioItem4");tg.getToggles().addAll(rmi1,rmi2,rmi3,rmi4);menu2.getItems().addAll(rmi1,rmi2,rmi3,rmi4);tg.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {@Overridepublic void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {//监听选中的项if (newValue.equals(rmi1)){System.out.println(1);}else if (newValue.equals(rmi2)){System.out.println(1);}else if (newValue.equals(rmi3)){System.out.println(1);}else if (newValue.equals(rmi4)){System.out.println(1);}}});

多选菜单
Menu menu3 = new Menu("多选菜单");//多选菜单CheckMenuItem cmi1 = new CheckMenuItem("选项一");CheckMenuItem cmi2 = new CheckMenuItem("选项二");CheckMenuItem cmi3 = new CheckMenuItem("选项三");menu3.getItems().addAll(cmi1,cmi2,cmi3);menuBar.getMenus().addAll(menu1,menu2,menu3);

右键菜单
Button rightClickMenuBtn = new Button("点击鼠标右键弹出菜单");MenuItem i1 = new MenuItem("MenuItem1");MenuItem i2 = new MenuItem("MenuItem2");MenuItem i3 = new MenuItem("MenuItem3");ContextMenu ctMenu = new ContextMenu();ctMenu.getItems().addAll(i1,i2,i3);rightClickMenuBtn.setContextMenu(ctMenu);AnchorPane.setTopAnchor(rightClickMenuBtn,60.0);//监听右键菜单弹出事件rightClickMenuBtn.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {@Overridepublic void handle(ContextMenuEvent event) {System.out.println("菜单弹出");}});an.getChildren().addAll(rightClickMenuBtn);Scene scene = new Scene(an);primaryStage.setScene(scene);primaryStage.setHeight(400);primaryStage.setWidth(400);primaryStage.show();

常见问题
监听菜单(Menu)的点击事件
如图:我们想要Menu1作为一个普通的按钮,点击后执行我们想要执行的业务逻辑,而不是弹出子菜单
解决方案:在菜单上添加一个Lable,然后监听Lable的点击事件
Menu menu1 = new Menu();Label lable = new Label("Menu1");menu1.setGraphic(lable);lable.setOnMouseClicked(event -> {System.out.println("点击了该菜单")});
