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.javaimport 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