普通菜单

  1. @Override
  2. public void start(Stage primaryStage) throws Exception {
  3. AnchorPane an = new AnchorPane();
  4. an.setStyle("-fx-background-color:#ffffff");
  5. MenuBar menuBar = new MenuBar();
  6. Menu menu1 = new Menu("Menu1");
  7. Menu menu2 = new Menu("Menu2");
  8. Menu menu3 = new Menu("Menu3");
  9. Menu menu4 = new Menu("Menu4");
  10. MenuItem item1 = new MenuItem("MenuItem1");
  11. MenuItem item2 = new MenuItem("MenuItem2");
  12. MenuItem item3 = new MenuItem("MenuItem3");
  13. MenuItem item4 = new MenuItem("MenuItem4");
  14. menu1.getItems().addAll(item1,item2,item3,item4);
  15. menuBar.getMenus().addAll(menu1,menu2,menu3,menu4);
  16. //menu1.setOnShown();//监听菜单栏显示
  17. //menu1.setOnHidden();//监听菜单栏隐藏
  18. item1.setOnAction(new EventHandler<ActionEvent>() {
  19. @Override
  20. public void handle(ActionEvent event) {
  21. //监听点击
  22. }
  23. });
  24. an.getChildren().addAll(menuBar);
  25. Scene scene = new Scene(an);
  26. primaryStage.setScene(scene);
  27. primaryStage.setHeight(400);
  28. primaryStage.setWidth(400);
  29. primaryStage.show();
  30. }

image.png image.png

菜单之间添加分割线(SeparatorMenuItem

  1. SeparatorMenuItem separatorMenuItem = new SeparatorMenuItem();//菜单栏间的分割线
  2. MenuBar menuBar = new MenuBar();
  3. Menu menu1 = new Menu("普通菜单");
  4. //普通菜单
  5. MenuItem item1 = new MenuItem("MenuItem1");
  6. MenuItem item2 = new MenuItem("MenuItem2");
  7. MenuItem item3 = new MenuItem("MenuItem3");
  8. menu1.getItems().addAll(item1,separatorMenuItem,item2,item3);

在菜单项上显示控件

  1. SeparatorMenuItem separatorMenuItem = new SeparatorMenuItem();//菜单栏间的分割线
  2. MenuBar menuBar = new MenuBar();
  3. Menu menu = new Menu("普通菜单");
  4. //普通菜单
  5. MenuItem item1 = new MenuItem("MenuItem1");
  6. MenuItem item2 = new MenuItem("MenuItem2");
  7. MenuItem item3 = new MenuItem("MenuItem3");
  8. //将一个按钮嵌在Item中
  9. CustomMenuItem item4 = new CustomMenuItem();
  10. Button button = new Button("button");
  11. item4.setContent(button);
  12. menu.getItems().addAll(item1,separatorMenuItem,item2,item3,item4);

单选菜单

  1. Menu menu2 = new Menu("单选菜单");
  2. //单选菜单
  3. ToggleGroup tg = new ToggleGroup();
  4. RadioMenuItem rmi1 = new RadioMenuItem("RadioItem1");
  5. RadioMenuItem rmi2 = new RadioMenuItem("RadioItem2");
  6. RadioMenuItem rmi3 = new RadioMenuItem("RadioItem3");
  7. RadioMenuItem rmi4 = new RadioMenuItem("RadioItem4");
  8. tg.getToggles().addAll(rmi1,rmi2,rmi3,rmi4);
  9. menu2.getItems().addAll(rmi1,rmi2,rmi3,rmi4);
  10. tg.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
  11. @Override
  12. public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
  13. //监听选中的项
  14. if (newValue.equals(rmi1)){
  15. System.out.println(1);
  16. }else if (newValue.equals(rmi2)){
  17. System.out.println(1);
  18. }else if (newValue.equals(rmi3)){
  19. System.out.println(1);
  20. }else if (newValue.equals(rmi4)){
  21. System.out.println(1);
  22. }
  23. }
  24. });

image.png

多选菜单

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

image.png

右键菜单

  1. Button rightClickMenuBtn = new Button("点击鼠标右键弹出菜单");
  2. MenuItem i1 = new MenuItem("MenuItem1");
  3. MenuItem i2 = new MenuItem("MenuItem2");
  4. MenuItem i3 = new MenuItem("MenuItem3");
  5. ContextMenu ctMenu = new ContextMenu();
  6. ctMenu.getItems().addAll(i1,i2,i3);
  7. rightClickMenuBtn.setContextMenu(ctMenu);
  8. AnchorPane.setTopAnchor(rightClickMenuBtn,60.0);
  9. //监听右键菜单弹出事件
  10. rightClickMenuBtn.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
  11. @Override
  12. public void handle(ContextMenuEvent event) {
  13. System.out.println("菜单弹出");
  14. }
  15. });
  16. an.getChildren().addAll(rightClickMenuBtn);
  17. Scene scene = new Scene(an);
  18. primaryStage.setScene(scene);
  19. primaryStage.setHeight(400);
  20. primaryStage.setWidth(400);
  21. primaryStage.show();

image.png

常见问题

监听菜单(Menu)的点击事件

如图:我们想要Menu1作为一个普通的按钮,点击后执行我们想要执行的业务逻辑,而不是弹出子菜单
JavaFX 菜单栏 - 图6

解决方案:在菜单上添加一个Lable,然后监听Lable的点击事件

  1. Menu menu1 = new Menu();
  2. Label lable = new Label("Menu1");
  3. menu1.setGraphic(lable);
  4. lable.setOnMouseClicked(event -> {
  5. System.out.println("点击了该菜单")
  6. });