普通菜单
@Override
public 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>() {
@Override
public 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>() {
@Override
public 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>() {
@Override
public 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("点击了该菜单")
});