MenuDemo.java

The context-sensitive pop-up menu brings up the following Alert dialog:

The help - about menu item brings up a (rather ugly) simple dialog

Also the source application does not wait for the dialog to close.


MenuDemo.java

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioMenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import javafx.stage.StageStyle;
import javafx.scene.Group;
import javafx.scene.text.Text;

import javafx.scene.input.KeyCombination;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.input.*;
import javafx.scene.control.ContextMenu;
import javafx.scene.layout.Pane;
import javafx.geometry.*;

import java.util.*;
import javafx.scene.control.ButtonType;

import javafx.scene.control.Alert;
//import javafx.scene.control.Alert.AlertType;



public class MenuDemo extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Menu Demo");
        BorderPane root = new BorderPane();
        Scene scene = new Scene(root, 300, 250, Color.WHITE);

	Pane area = new Pane();
	root.setCenter(area);

        MenuBar menuBar = new MenuBar();
        menuBar.prefWidthProperty().bind(primaryStage.widthProperty());
        root.setTop(menuBar); 

        // File menu - new, save, exit
        Menu fileMenu = new Menu("_File");
        MenuItem newMenuItem = new MenuItem("_New");
        newMenuItem.setAccelerator(
            KeyCombination.keyCombination("SHORTCUT+N")
        );
        MenuItem saveMenuItem = new MenuItem("Save");
        MenuItem exitMenuItem = new MenuItem("_Exit");
        exitMenuItem.setAccelerator(
            KeyCombination.keyCombination("SHORTCUT+E")
        );
        exitMenuItem.setOnAction(actionEvent -> {
		Platform.exit();
		System.exit(0);
	}
	);

        fileMenu.getItems().addAll(newMenuItem, 
                saveMenuItem, 
                new SeparatorMenuItem(), 
                exitMenuItem
        );

	Menu helpMenu = new Menu("_Help");
        MenuItem aboutMenuItem = new MenuItem("About");
        aboutMenuItem.setOnAction(actionEvent -> showDialog("Menu Demo") );
	helpMenu.getItems().add(aboutMenuItem);
 
        menuBar.getMenus().addAll(fileMenu,helpMenu);


        // --- Context Menu
        ContextMenu cm = new ContextMenu();
        MenuItem cmItem1 = new MenuItem("hello");

	/* anonymous inner class
        cmItem1.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
		showDialog("popup event triggered");
            }
        });
	*/

	// lambda expression
	cmItem1.setOnAction(e -> showAlert("popup event triggered ") );
	// note: e.getSource == cmItem1

        cm.getItems().add(cmItem1);
	area.setOnMouseClicked(e -> {
                if (e.getButton() == MouseButton.SECONDARY)
                        cm.show(area, e.getScreenX(), e.getScreenY());
	}
	);	
	/*
        area.addEventHandler(MouseEvent.MOUSE_CLICKED,
            new EventHandler<MouseEvent>() {
                @Override public void handle(MouseEvent e) {
                if (e.getButton() == MouseButton.SECONDARY)
                        cm.show(area, e.getScreenX(), e.getScreenY());
                }
        });
	*/


        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public void showAlert(String str) {
 	Alert a = new Alert(Alert.AlertType.INFORMATION);
	a.setHeaderText(str);
	/* optional 
        a.setTitle("My Title");
        a.setHeaderText("My Header Text");
        a.setResizable(true);
        String version = System.getProperty("java.version");
        String content = String.format("Java: %s.\nThis is a long text. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", version);
        a.setContentText(content);
	*/
        a.showAndWait();
  }
 	

    public void showDialog(String str) {
	int nchar = str.length();
	Stage dialog = new Stage();
	dialog.initStyle(StageStyle.UTILITY);
	Text txt = new Text(25, 25, str);
	Bounds b = txt.getBoundsInLocal();
	Scene scene = new Scene(new Group(txt),50+b.getWidth(),60); //50+8*nchar
	dialog.setScene(scene);
 	dialog.showAndWait();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}


Maintained by John Loomis, updated Sat Mar 03 18:36:15 2018