单击菜单栏时调用方法?

时间:2012-11-18 22:14:51

标签: menu javafx-2

我想在MenuBar中添加一个空的javafx.scene.control.Menu并让它在点击时调用一个方法。

我尝试使用menu.setOnShowing(new EventHandler<Event>(){});但没有运气。

以下是我目前正在使用的内容:

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;
}

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

2 个答案:

答案 0 :(得分:2)

您的Menu需要至少包含一个MenuItem才能触发事件。

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);
    }
}

我得到的输出如下所示:

enter image description here

答案 1 :(得分:1)

虽然API建议不这样做,但是当菜单中没有MenuItem或隐藏它们时,onShowing事件不会被调用。

我能够在hide()事件中使用Menu的onShown方法来解决此问题。

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;
}