Menu 单击菜单栏时是否进行菜单栏调用方法?

Menu 单击菜单栏时是否进行菜单栏调用方法?,menu,javafx-2,Menu,Javafx 2,我想在菜单栏中添加一个空的javafx.scene.control.Menu,并让它在单击时调用一个方法 我尝试过使用menu.setOnShowing(neweventhandler(){})

我想在菜单栏中添加一个空的
javafx.scene.control.Menu
,并让它在单击时调用一个方法

我尝试过使用
menu.setOnShowing(neweventhandler(){})
以下是我目前的工作内容:

public MenuBar createMenuBar() {
    MenuBar menuBar = new MenuBar();
    Menu file = new Menu("File");

    Menu addAccountTab = new Menu("Add Tab");
    addAccountTab.setOnShowing(new EventHandler<Event>() {
        public void handle(Event e) {
            System.out.println("addAccountTab Menu clicked.");
        }
    });
    menuBar.getMenus().add(addAccount);
    return menuBar;
}
public菜单栏createMenuBar(){
菜单栏菜单栏=新建菜单栏();
菜单文件=新菜单(“文件”);
菜单addAccountTab=新菜单(“添加选项卡”);
addAccountTab.setOnShowing(新的EventHandler(){
公共无效句柄(事件e){
System.out.println(“单击addAccountTab菜单”);
}
});
menuBar.getMenus().add(addAccount);
返回菜单栏;
}

但是,单击菜单不会调用onShowing事件。

您的
菜单需要至少包含一个
菜单项才能触发事件

public class MenuApplication extends Application {

    @Override
    public void start(Stage primaryStage) {
        MenuBar menuBar = new MenuBar();
        Menu file = new Menu("File");

        Menu addAccountTab = new Menu("Add Tab");

        addAccountTab.setOnShowing(new EventHandler<Event>() {
            @Override
            public void handle(Event e) {
                System.out.println("addAccountTab Menu clicked.");
            }
        });

        MenuItem NewMenuItem = new MenuItem("New");
        addAccountTab.getItems().add(NewMenuItem);

        menuBar.getMenus().addAll(file, addAccountTab);

        StackPane root = new StackPane();
        root.getChildren().add(menuBar);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
公共类菜单应用程序扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
菜单栏菜单栏=新建菜单栏();
菜单文件=新菜单(“文件”);
菜单addAccountTab=新菜单(“添加选项卡”);
addAccountTab.setOnShowing(新的EventHandler(){
@凌驾
公共无效句柄(事件e){
System.out.println(“单击addAccountTab菜单”);
}
});
MenuItem NewMenuItem=新MenuItem(“新”);
addAccountTab.getItems().add(NewMenuItem);
menuBar.getMenus().addAll(文件,addAccountTab);
StackPane root=新的StackPane();
root.getChildren().add(菜单栏);
场景=新场景(根,300,250);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
我得到的输出如下所示:


尽管API提出了相反的建议,但当菜单中没有菜单项或菜单项全部隐藏时,不会调用显示的
事件

我可以通过在shown
事件中使用Menu的
hide()
方法来解决这个问题

public MenuBar createMenuBar() {
    MenuBar menuBar = new MenuBar();
    Menu addAccount = MenuBuilder.create()
        .onShown(new EventHandler<Event>() {
            public void handle(Event e) {
                ((Menu)e.getSource()).hide();
                System.out.println("addAccount Clicked");
            }
        }).items(new MenuItem())
        .text("Add Account").build();
    menuBar.getMenus().addAll(addAccount);

    return menuBar;
}
public菜单栏createMenuBar(){
菜单栏菜单栏=新建菜单栏();
Menu addAccount=MenuBuilder.create()
.onShown(新的EventHandler(){
公共无效句柄(事件e){
((菜单)e.getSource()).hide();
System.out.println(“点击添加帐户”);
}
}).items(新菜单项())
.text(“添加帐户”).build();
menuBar.getMenus().addAll(addAccount);
返回菜单栏;
}

感谢您的回复,但是我发现使用
((菜单)e.getSource()).hide()setOnShown()
事件中,code>允许在不显示上下文菜单的情况下单击菜单。