Morrison's JavaFX Page: Making Menus




Installing a Menu Bar and Menus into a Stage We begin with a minimal shell program.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MenuSample extends Application
{
    @Override
    public void start(Stage stage)
    {
        stage.setTitle("Menu Sample");
        Scene scene = new Scene(new VBox(), 400, 400);
        stage.setScene(scene);
        stage.show();
    }
}

Compilation and running reveals an empty window.

picture of empty menu stage

Now add a menu bar. If you run this, you will see the same picture as above, because the menu bar has height 1 px. We need to populate it with something. So here we go.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MenuSample extends Application
{
    @Override
    public void start(Stage stage)
    {
        stage.setTitle("Menu Sample");
        Scene scene = new Scene(new VBox(), 400, 400);

        MenuBar mbar = new MenuBar();
        mbar.getMenus().addAll(fileMenu, editMenu);
        ( (VBox) scene.getRoot()).getChildren().addAll(mbar);
        stage.setScene(scene);
        stage.show();
    }
}

We add a file and edit menu.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MenuSample extends Application
{
    @Override
    public void start(Stage stage)
    {
        stage.setTitle("Menu Sample");
        Scene scene = new Scene(new VBox(), 400, 400);

        MenuBar mbar = new MenuBar();
        Menu fileMenu = new Menu("File");
        Menu editMenu = new Menu("Edit");
        mbar.getMenus().addAll(fileMenu, editMenu);
        ( (VBox) scene.getRoot()).getChildren().addAll(mbar);
        stage.setScene(scene);
        stage.show();
    }
}

Compile and run to see this. We have a window with two menus in its menu bar.

picture stage with two menus

Next we populate the file menu.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MenuSample extends Application
{
    @Override
    public void start(Stage stage)
    {
        stage.setTitle("Menu Sample");
        Scene scene = new Scene(new VBox(), 400, 400);

        MenuBar mbar = new MenuBar();
        Menu fileMenu = new Menu("File");
        //populate fileMenu
        MenuItem newItem = new MenuItem("New") ;
        MenuItem openItem = new MenuItem("Open...") ;
        MenuItem closeItem = new MenuItem("Close") ;
        MenuItem quitItem = new MenuItem("Quit") ;
        fileMenu.getItems().addAll(newItem, openItem, closeItem, quitItem);
        Menu editMenu = new Menu("Edit");
        mbar.getMenus().addAll(fileMenu, editMenu);
        ( (VBox) scene.getRoot()).getChildren().addAll(mbar);
        stage.setScene(scene);
        stage.show();
    }
}

We show the file menu being opened here.

picture stage with two menus

Finally, we shall make the quit menu item live, and give it the usual keyboard accelarator. Add this import.

import javafx.scene.input.KeyCombination;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.input.KeyCombination;

public class MenuSample extends Application
{
    @Override
    public void start(Stage stage)
    {
        stage.setTitle("Menu Sample");
        Scene scene = new Scene(new VBox(), 400, 400);

        MenuBar mbar = new MenuBar();
        Menu fileMenu = new Menu("File");
        //populate fileMenu
        MenuItem newItem = new MenuItem("New") ;
        MenuItem openItem = new MenuItem("Open...") ;
        MenuItem closeItem = new MenuItem("Close") ;
        MenuItem quitItem = new MenuItem("Quit") ;
        quitItem.setAccelerator(KeyCombination.keyCombination("Ctrl+X"));
        quitItem.setOnAction(e -> System.exit(0));
        fileMenu.getItems().addAll(newItem, openItem, closeItem, quitItem);
        Menu editMenu = new Menu("Edit");
        mbar.getMenus().addAll(fileMenu, editMenu);
        ( (VBox) scene.getRoot()).getChildren().addAll(mbar);
        stage.setScene(scene);
        stage.show();
    }
}

This app now quits via the menu or via the keyboard combination control-x.

Following this demo has shown you how to install menus in a window and how to make the menu items "live." Note that menu items are really just buttons. We used a lambda to write the listener for the quit menu item.