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