单击菜单项时如何执行操作?

时间:2014-02-26 15:12:38

标签: javafx javafx-2 menuitem

我正在使用Netbeans IDE在javafx上做一个项目。我是javafx的新手。我的项目中有一个菜单栏。单击每个菜单项(而不是新场景)时,我需要在相同的窗口上打开一个新页面。代码如下:

private VBox addVBox1() {

    final VBox vbox = new VBox();
    vbox.setPadding(new Insets(20,40,30,4)); 
    vbox.setSpacing(10);

    MenuBar menuBar = new MenuBar();

    Menu menuFile1 = new Menu("ADD");
    Menu menuFile2 = new Menu("EDIT");
    Menu menuFile3 = new Menu("VIEW");
    Menu menuFile4 = new Menu("HELP");

    MenuItem add1 = new MenuItem("ENTER STUDENT DETAILS");
    MenuItem add2 = new MenuItem("ENTER C-MARK");
    MenuItem add3 = new MenuItem("ENTER ATTENDANCE");

    MenuItem add4 = new MenuItem("EDIT STUDENT DETAILS");
    MenuItem add6 = new MenuItem("EDIT C-MARK");
    MenuItem add8 = new MenuItem("EDIT ATTENDANCE");

    MenuItem add10 = new MenuItem("STUDENT DETAILS");
    MenuItem add11 = new MenuItem("C-MARK");
    MenuItem add12 = new MenuItem("ATTENDANCE");

    MenuItem add13 = new MenuItem("VIEW HELP"); 

    add1.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent t) {
            //...WHAT TO INCLUDE HERE ?
        }
    });

    menuFile1.getItems().addAll(add1,add2,add3);
    menuFile2.getItems().addAll(add4,add6,add8);
    menuFile3.getItems().addAll(add10,add11,add12);
    menuFile4.getItems().addAll(add13);
    menuBar.getMenus().addAll(menuFile1,menuFile2,menuFile3,menuFile4);

    vbox.getChildren().addAll(menuBar);

    return vbox;
   }

在我的项目中,我点击按钮时打开新页面。它的代码是:

btn2.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent e) {
    ((Stage)btn2.getScene().getWindow()).setScene(new Scene(new Login()));
     }
    });

是否可以在菜单项的情况下实现此代码?如何在单击菜单项时编辑此代码以执行操作?

2 个答案:

答案 0 :(得分:4)

我不确切地知道新页面的含义。有一个Pagination control,但我不认为你的意思。以下是添加TextArea的方法,但您必须设计UI并选择自己的控件。

add1.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent t) {
        vbox.getChildren().add(new TextArea());
    }
});

这是如何创建一个新窗口,但您可能想问一个关于设计对话框的问题。这是一个SO答案https://stackoverflow.com/a/14168238/2855515

add1.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent t) {
        Stage stage = new Stage();
        Scene scene = new Scene(new VBox());
        stage.setTitle("popup");
        stage.setScene(scene);
        stage.show();
    }
});

答案 1 :(得分:1)

我认为这个问题没有得到正确回答,问题被误解了。

TomJ 问:

<块引用>

是否可以在菜单项的情况下实现此代码?

当他说“菜单项”时,他的意思是 Menu 还是 MenuItem?他正在清除显示如何为 MenuItem 执行此操作的正确代码。我想他是在问如何为 Menu 做同样的事情。我尝试为 Menu 执行此操作,在 Menu 上调用处理程序的代码与为 MenuItem 执行此操作的代码略有不同。

这是一个简单的代码示例,其中单击执行菜单时调用 execute 方法:

Menu viewMenu = new Menu("View");
MenuItem viewJobs = new MenuItem("Jobs");
viewJobs.setOnAction(viewJobsAction);
MenuItem viewFileSelection = new MenuItem("File Selection");
viewFileSelection.setOnAction(e->{viewFileSelection());
viewMenu.getItems().addAll(viewJobs, viewFileSelection);

Menu execute = new Menu("Execute");
execute.onShownProperty().setValue(e->{execute());
// if the following line is not added, the onShownProperty event handler
// will never be called!
execute.getItems().addAll(new MenuItem());


Menu help = new Menu("Help");
MenuItem helpItem = new MenuItem("Help");
helpItem.setOnAction(e->{showHelp()}
MenuItem aboutItem = new MenuItem("About");
aboutItem.setOnAction(e->{showAbout()}
help.getItems().addAll(helpItem,aboutItem);
menubar.getMenus().addAll(viewMenu, execute, help);

必须在执行菜单中添加一个伪造的 MenuItem 才能使其工作。对于 Menu,最好使用 onShownPropertyonShowingProperty 而不是使用 setOnAction。它们中的任何一个都可以工作,但在调用处理程序之前 setOnAction 需要再次点击。

菜单 onShowingProperty 的 JavaDoc 说:

<块引用>

在 ContextMenu 显示之前调用,即使菜单有 没有要显示的项目。但是请注意,如果菜单 没有有效的锚节点。

听起来代码应该可以在不添加任何 MenuItem 的情况下工作,但事实并非如此。但是,它表示如果菜单没有有效的锚节点,则不会进行调用。我不确定锚节点是什么,也找不到有关如何将锚节点添加到菜单的任何文档。添加虚假的空 MenuItem 显然使执行菜单具有有效的锚节点。如果有人更了解锚节点,请回复并解释,但我给出的代码示例可以接受。