下面列出了怎么用javafx.scene.control.Menu的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public void start(Stage primaryStage) throws Exception {
StackPane root = new StackPane();
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.requestFocus();
primaryStage.show();
// Get the toolkit
MenuToolkit tk = MenuToolkit.toolkit();
// Create the default Application menu
Menu defaultApplicationMenu = tk.createDefaultApplicationMenu("test");
// Update the existing Application menu
tk.setApplicationMenu(defaultApplicationMenu);
// Since we now have a reference to the menu, we can rename items
defaultApplicationMenu.getItems().get(1).setText("Hide all the otters");
}
private void initializeParts() {
menuBar = new MenuBar();
menu = new Menu("Edit");
preferencesMenuItem = new MenuItem("Preferences");
welcomeLbl = new Label();
brightnessLbl = new Label();
nightModeLbl = new Label();
scalingLbl = new Label();
screenNameLbl = new Label();
resolutionLbl = new Label();
orientationLbl = new Label();
favoritesLbl = new Label();
fontSizeLbl = new Label();
lineSpacingLbl = new Label();
favoriteNumberLbl = new Label();
}
@MustCallOnJavaFXThread
private Menu fileMenu() {
Menu menu = new Menu( "_File" );
menu.setMnemonicParsing( true );
MenuItem open = new MenuItem( "_Open File" );
open.setAccelerator( new KeyCodeCombination( KeyCode.O, KeyCombination.SHORTCUT_DOWN ) );
open.setMnemonicParsing( true );
open.setOnAction( ( event ) -> new FileOpener( stage, this::open ) );
MenuItem showLogFxLog = new MenuItem( "Open LogFX Log" );
showLogFxLog.setAccelerator( new KeyCodeCombination( KeyCode.O,
KeyCombination.SHORTCUT_DOWN, KeyCombination.SHIFT_DOWN ) );
showLogFxLog.setOnAction( ( event ) ->
open( LogFXLogFactory.INSTANCE.getLogFilePath().toFile() ) );
MenuItem close = new MenuItem( "E_xit" );
close.setAccelerator( new KeyCodeCombination( KeyCode.W,
KeyCombination.SHIFT_DOWN, KeyCombination.SHORTCUT_DOWN ) );
close.setMnemonicParsing( true );
close.setOnAction( ( event ) -> stage.close() );
menu.getItems().addAll( open, showLogFxLog, close );
return menu;
}
@Inject
public WorkspaceMenu(RecentWorkspacesService service) {
super(DefaultI18nContext.getInstance().i18n("_Workspace"));
this.service = service;
setId("workspaceMenu");
MenuItem load = new MenuItem(DefaultI18nContext.getInstance().i18n("_Load"));
load.setId("loadWorkspace");
load.setOnAction(e -> loadWorkspace());
MenuItem save = new MenuItem(DefaultI18nContext.getInstance().i18n("_Save"));
save.setOnAction(e -> saveWorkspace());
save.setId("saveWorkspace");
recent = new Menu(DefaultI18nContext.getInstance().i18n("Recen_ts"));
recent.setId("recentWorkspace");
service.getRecentlyUsedWorkspaces().stream().map(WorkspaceMenuItem::new).forEach(recent.getItems()::add);
MenuItem clear = new MenuItem(DefaultI18nContext.getInstance().i18n("_Clear recents"));
clear.setOnAction(e -> clearWorkspaces());
clear.setId("clearWorkspaces");
getItems().addAll(load, save, new SeparatorMenuItem(), recent, clear);
eventStudio().addAnnotatedListeners(this);
}
private String getTagForMenu(MenuItem source) {
LinkedList<MenuItem> menuItems = new LinkedList<>();
while (source != null) {
menuItems.addFirst(source);
source = source.getParentMenu();
}
if (menuItems.getFirst() instanceof Menu) {
if (menuItems.size() >= 2) {
ownerNode = menuItems.get(1).getParentPopup().getOwnerNode();
return isMenuBar(ownerNode) ? "#menu" : "#contextmenu";
}
} else {
ownerNode = menuItems.getFirst().getParentPopup().getOwnerNode();
return "#contextmenu";
}
return null;
}
@Test
public void menuPath() {
List<String> path = new ArrayList<>();
Platform.runLater(() -> {
Menu menuFile = new Menu("File");
MenuItem add = new MenuItem("Shuffle");
MenuItem clear = new MenuItem("Clear");
MenuItem exit = new MenuItem("Exit");
menuFile.getItems().addAll(add, clear, new SeparatorMenuItem(), exit);
RFXMenuItem rfxMenuItem = new RFXMenuItem(null, null);
path.add(rfxMenuItem.getSelectedMenuPath(clear));
});
new Wait("Waiting for menu selection path") {
@Override
public boolean until() {
return path.size() > 0;
}
};
AssertJUnit.assertEquals("File>>Clear", path.get(0));
}
@Test
public void menuItemIconNoText() {
List<String> path = new ArrayList<>();
Platform.runLater(() -> {
Menu menuFile = new Menu("File");
MenuItem add = new MenuItem("Shuffle");
MenuItem clear = new MenuItem();
clear.setGraphic(new ImageView(RFXTabPaneTest.imgURL.toString()));
MenuItem exit = new MenuItem("Exit");
menuFile.getItems().addAll(add, clear, new SeparatorMenuItem(), exit);
RFXMenuItem rfxMenuItem = new RFXMenuItem(null, null);
path.add(rfxMenuItem.getSelectedMenuPath(clear));
});
new Wait("Waiting for menu selection path") {
@Override
public boolean until() {
return path.size() > 0;
}
};
AssertJUnit.assertEquals("File>>middle", path.get(0));
}
@Test
public void subMenuPath() {
List<String> path = new ArrayList<>();
Platform.runLater(() -> {
Menu menuEdit = new Menu("Edit");
Menu menuEffect = new Menu("Picture Effect");
final MenuItem noEffects = new MenuItem("No Effects");
menuEdit.getItems().addAll(menuEffect, noEffects);
MenuItem add = new MenuItem("Shuffle");
menuEffect.getItems().addAll(add);
RFXMenuItem rfxMenuItem = new RFXMenuItem(null, null);
path.add(rfxMenuItem.getSelectedMenuPath(add));
});
new Wait("Waiting for menu selection path") {
@Override
public boolean until() {
return path.size() > 0;
}
};
AssertJUnit.assertEquals("Edit>>Picture Effect>>Shuffle", path.get(0));
}
@Test
public void duplicateMenuPath() {
List<String> path = new ArrayList<>();
Platform.runLater(() -> {
Menu menuFile = new Menu("File");
MenuItem add = new MenuItem("Shuffle");
MenuItem clear = new MenuItem("Clear");
MenuItem clear1 = new MenuItem("Clear");
MenuItem clear2 = new MenuItem("Clear");
MenuItem exit = new MenuItem("Exit");
menuFile.getItems().addAll(add, clear, clear1, clear2, new SeparatorMenuItem(), exit);
RFXMenuItem rfxMenuItem = new RFXMenuItem(null, null);
path.add(rfxMenuItem.getSelectedMenuPath(clear2));
});
new Wait("Waiting for menu selection path") {
@Override
public boolean until() {
return path.size() > 0;
}
};
AssertJUnit.assertEquals("File>>Clear(2)", path.get(0));
}
private void handleVariableType(VariableSelection selection) {
ContextMenu menu = new ContextMenu();
Menu refs = new Menu(LangUtil.translate("ui.edit.method.referrers"));
for (AST ast : root.getChildren()) {
if (ast instanceof VarInsnAST && ((VarInsnAST) ast).getVariableName().getName().equals(selection.name)) {
MenuItem ref = new ActionMenuItem(ast.getLine() + ": " + ast.print(), () -> {
int line = ast.getLine() - 1;
codeArea.moveTo(line, 0);
codeArea.requestFollowCaret();
});
refs.getItems().add(ref);
}
}
if (refs.getItems().isEmpty())
refs.setDisable(true);
menu.getItems().add(refs);
codeArea.setContextMenu(menu);
}
private void handleSwitchType(SwitchSelection selection) {
ContextMenu menu = new ContextMenu();
Menu refs = new Menu(LangUtil.translate("ui.edit.method.follow"));
for(AST ast : root.getChildren()) {
if(ast instanceof LabelAST) {
String name = ((LabelAST) ast).getName().getName();
String key = selection.mappings.get(name);
if (key == null && name.equals(selection.dflt))
key = "Default";
if(key != null) {
MenuItem ref = new ActionMenuItem(key + ": '" + ast.getLine() + ": " + ast.print() +"'", () -> {
int line = ast.getLine() - 1;
codeArea.moveTo(line, 0);
codeArea.requestFollowCaret();
});
refs.getItems().add(ref);
}
}
}
if(refs.getItems().isEmpty())
refs.setDisable(true);
menu.getItems().add(refs);
codeArea.setContextMenu(menu);
}
@Override
@FxThread
public void fillContextMenu(@NotNull final NodeTree<?> nodeTree,
@NotNull final ObservableList<MenuItem> items) {
if (getElement() instanceof PhysicsCollisionObject) {
final Menu changeShapeMenu = new Menu(Messages.MODEL_NODE_TREE_ACTION_CHANGE_COLLISION_SHAPE, new ImageView(Icons.ADD_12));
changeShapeMenu.getItems().addAll(new GenerateCollisionShapeAction(nodeTree, this),
new CreateBoxCollisionShapeAction(nodeTree, this),
new CreateCapsuleCollisionShapeAction(nodeTree, this),
new CreateConeCollisionShapeAction(nodeTree, this),
new CreateCylinderCollisionShapeAction(nodeTree, this),
new CreateSphereCollisionShapeAction(nodeTree, this));
items.add(changeShapeMenu);
}
super.fillContextMenu(nodeTree, items);
}
@Override
public void start(Stage primaryStage) throws Exception {
StackPane root = new StackPane();
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.requestFocus();
primaryStage.show();
MenuToolkit tk = MenuToolkit.toolkit();
MenuBar bar = new MenuBar();
MenuItem item1 = new MenuItem("Item1");
MenuItem item2 = new MenuItem("Item2");
MenuItem item3 = new MenuItem("Item3");
item3.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Item3 clicked");
}
});
MenuItem item4 = tk.createQuitMenuItem("my app");
Menu menu2 = new Menu("Menu2");
menu2.getItems().add(item2);
Menu menu1 = new Menu("Menu1");
menu1.getItems().addAll(item1, menu2, item4);
Menu menu3 = new Menu("Menu3");
menu3.getItems().addAll(item3);
bar.getMenus().addAll(menu1, menu3);
tk.setMenuBar(primaryStage, bar);
}
@Override
public void start(Stage primaryStage) throws Exception {
StackPane root = new StackPane();
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.requestFocus();
primaryStage.show();
MenuToolkit tk = MenuToolkit.toolkit();
MenuBar bar = new MenuBar();
MenuItem item1 = new MenuItem("Item1");
MenuItem item2 = new MenuItem("Item2");
MenuItem item3 = new MenuItem("Mute");
item3.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Muted");
}
});
MenuItem quit = tk.createQuitMenuItem("mars-sim");
Menu menu2 = new Menu("Menu2");
menu2.getItems().add(item2);
Menu menu1 = new Menu("Menu1");
menu1.getItems().addAll(item1, menu2, quit);
Menu file = new Menu("File");
file.getItems().addAll(item3);
bar.getMenus().addAll(menu1, file);
tk.setMenuBar(primaryStage, bar);
}
private void updateMenuBar(final Tab oldValue, final Tab newValue) {
if (oldValue != null && oldValue instanceof ContextMenuContainer) {
Menu menu = ((ContextMenuContainer) oldValue).getMenu();
menuBar.getMenus().remove(menu);
}
if (newValue != null && newValue instanceof ContextMenuContainer) {
Menu newMenu = ((ContextMenuContainer) newValue).getMenu();
if (newMenu != null) {
menuBar.getMenus().add(menuBar.getMenus().size() - 1, newMenu);
}
}
}
private void createHelpMenu() {
MenuItem aboutMenuItem = new MenuItem("_About");
aboutMenuItem.setOnAction(e -> AboutDialog.showDialog());
aboutMenuItem.setMnemonicParsing(true);
Menu helpMenu = new Menu("_Help");
helpMenu.getItems().add(aboutMenuItem);
helpMenu.setMnemonicParsing(true);
getMenus().add(helpMenu);
}
@MustCallOnJavaFXThread
private Menu viewMenu() {
Menu menu = new Menu( "_View" );
menu.setMnemonicParsing( true );
CheckMenuItem highlight = new CheckMenuItem( "_Highlight Options" );
highlight.setAccelerator( new KeyCodeCombination( KeyCode.H, KeyCombination.SHORTCUT_DOWN ) );
highlight.setMnemonicParsing( true );
bindMenuItemToDialog( highlight, () ->
showHighlightOptionsDialog( highlightOptions ) );
MenuItem orientation = new MenuItem( "Switch Pane Orientation" );
orientation.setAccelerator( new KeyCodeCombination( KeyCode.S,
KeyCombination.SHIFT_DOWN, KeyCombination.SHORTCUT_DOWN ) );
orientation.setOnAction( event -> logsPane.switchOrientation() );
CheckMenuItem font = new CheckMenuItem( "Fon_t" );
font.setAccelerator( new KeyCodeCombination( KeyCode.F,
KeyCombination.SHIFT_DOWN, KeyCombination.SHORTCUT_DOWN ) );
font.setMnemonicParsing( true );
bindMenuItemToDialog( font, () -> showFontPicker( config.fontProperty() ) );
CheckMenuItem filter = new CheckMenuItem( "Enable _filters" );
filter.setAccelerator( new KeyCodeCombination( KeyCode.F,
KeyCombination.SHORTCUT_DOWN ) );
filter.setMnemonicParsing( true );
filter.selectedProperty().bindBidirectional( config.filtersEnabledProperty() );
MenuItem showContextMenu = new MenuItem( "Show Context Menu" );
showContextMenu.setAccelerator( new KeyCodeCombination( KeyCode.E, KeyCombination.SHORTCUT_DOWN ) );
showContextMenu.setOnAction( event -> logsPane.showContextMenu() );
menu.getItems().addAll( highlight, orientation, font, filter, showContextMenu );
return menu;
}
public static Collection<MenuItem> findItemsInMenuWithId(FxRobot robot, String menuToFind) {
MenuBar menuBar = robot.lookup("#mainMenu").query();
MenuItem menu = menuBar.getMenus().stream().flatMap(m-> m.getItems().stream())
.filter(m -> menuToFind.equals(m.getId()))
.findFirst().orElseThrow(RuntimeException::new);
return ((Menu)menu).getItems();
}
public static Collection<MenuItem> recurseGetAllMenus(FxRobot robot, Collection<MenuItem> items) {
var ret = new ArrayList<MenuItem>();
for (MenuItem item : items) {
ret.add(item);
if(item instanceof Menu) {
ret.addAll(recurseGetAllMenus(robot, ((Menu)item).getItems()));
}
}
return ret;
}
private void addSubmenu(int items, int subItems) {
for (int i = 0; i < items; i++) {
Menu subMenu = new Menu("New Submenu " + itemsCount++);
itemsLst.add(subMenu);
for (int j = 0; j < subItems; j++) {
subMenu.getItems().add(new MenuItem("New Sub MenuItem " + (j + 1)));
}
getWorkbench().getNavigationDrawerItems().add(subMenu);
}
}
private MenuButton buildSubmenu(MenuItem item) {
Menu menu = (Menu) item;
MenuButton menuButton = new MenuButton();
menuButton.setPopupSide(Side.RIGHT);
menuButton.graphicProperty().bind(menu.graphicProperty());
menuButton.textProperty().bind(menu.textProperty());
menuButton.disableProperty().bind(menu.disableProperty());
menuButton.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
menuButton.getStyleClass().addAll(item.getStyleClass());
Bindings.bindContent(menuButton.getItems(), menu.getItems());
// To determine if a TOUCH_RELEASED event happens.
// The MOUSE_ENTERED results in an unexpected behaviour on touch events.
// Event filter triggers before the handler.
menuButton.addEventFilter(TouchEvent.TOUCH_RELEASED, e -> isTouchUsed = true);
// Only when ALWAYS or SOMETIMES
if (!Priority.NEVER.equals(getSkinnable().getMenuHoverBehavior())) {
menuButton.addEventHandler(MouseEvent.MOUSE_ENTERED, e -> { // Triggers on hovering over Menu
if (isTouchUsed) {
isTouchUsed = false;
return;
}
// When ALWAYS, then trigger immediately. Else check if clicked before (case: SOMETIMES)
if (Priority.ALWAYS.equals(getSkinnable().getMenuHoverBehavior())
|| (hoveredBtn != null && hoveredBtn.isShowing())) {
menuButton.show(); // Shows the context-menu
if (hoveredBtn != null && hoveredBtn != menuButton) {
hoveredBtn.hide(); // Hides the previously hovered Button if not null and not self
}
}
hoveredBtn = menuButton; // Add the button as previously hovered
});
}
return menuButton;
}
private void buildMenu() {
menuContainer.getChildren().clear();
for (MenuItem item : getSkinnable().getItems()) {
if (item instanceof Menu) {
// item is a submenu
menuContainer.getChildren().add(buildSubmenu(item));
} else {
// item is a regular menu item
menuContainer.getChildren().add(buildMenuItem(item));
}
}
}
private void initializeParts() {
menuBar = new MenuBar();
menu = new Menu("Edit");
preferencesMenuItem = new MenuItem("Preferences");
welcomeLbl = new Label();
brightnessLbl = new Label();
nightModeLbl = new Label();
scalingLbl = new Label();
}
private static Menu matcherAsMenu(
final String menuText,
final List<String> candidates,
final Consumer<String> processSelection) {
final Menu menu = new Menu(menuText);
final Consumer<String> hideAndProcess = selection -> {
menu.getParentMenu();
menu.hide();
for (Menu m = menu.getParentMenu(); m != null; m = m.getParentMenu())
m.hide();
Optional.ofNullable(menu.getParentPopup()).ifPresent(ContextMenu::hide);
processSelection.accept(selection);
};
final MatchSelection matcher = MatchSelection.fuzzySorted(candidates, hideAndProcess);
matcher.setMaxWidth(400);
final CustomMenuItem cmi = new CustomMenuItem(matcher, false);
menu.setOnShowing(e -> {Platform.runLater(matcher::requestFocus);});
// clear style to avoid weird blue highlight
cmi.getStyleClass().clear();
menu.getItems().setAll(cmi);
return menu;
}
public Optional<Menu> getMenu(
String menuText,
PainteraBaseView viewer,
Supplier<String> projectDirectory,
Consumer<Exception> exceptionHandler)
{
try {
return Optional.of(getMenu(menuText, viewer, projectDirectory));
} catch (InstantiableException e) {
exceptionHandler.accept(e);
return Optional.empty();
}
}
public Menu getMenu(
final String menuText,
final PainteraBaseView viewer,
final Supplier<String> projectDirectory) throws InstantiableException
{
List<Pair<String, Consumer<ActionEvent>>> asConsumers = new ArrayList<>();
final List<Pair<String, BiConsumer<PainteraBaseView, Supplier<String>>>> handlers = new ArrayList<>(getMenuEntries());
for (Pair<String, BiConsumer<PainteraBaseView, Supplier<String>>> handler : handlers)
{
Consumer<ActionEvent> consumer = event -> handler.getValue().accept(viewer, projectDirectory);
asConsumers.add(new Pair<>(handler.getKey(), consumer));
}
return new MenuFromHandlers(asConsumers).asMenu(menuText);
}
/**
* Create Menu with new file/folder options
*
* @return
*/
private Menu createNewMenu() {
Menu newMenu = new Menu("New");
newMenu.getItems().add(newTestcaseAction.getMenuItem());
newMenu.getItems().add(etAction.getMenuItem());
newMenu.getItems().add(newModuleAction.getMenuItem());
newMenu.getItems().add(newFixtureAction.getMenuItem());
newMenu.getItems().add(newCheckListAction.getMenuItem());
newMenu.getItems().add(newModuleDirAction.getMenuItem());
newMenu.getItems().add(newSuiteFileAction.getMenuItem());
newMenu.getItems().add(newFeatureFileAction.getMenuItem());
newMenu.getItems().add(newStoryFileAction.getMenuItem());
newMenu.getItems().add(newIssueFileAction.getMenuItem());
return newMenu;
}
public String parentMenuText(ObservableList<Menu> menus, int index) {
String original = getMenuText(menus, index);
String itemText = original;
int suffixIndex = 0;
for (int i = 0; i < index; i++) {
String current = getMenuText(menus, i);
if (current.equals(original)) {
itemText = String.format("%s(%d)", original, ++suffixIndex);
}
}
return itemText;
}
private String getMenuText(ObservableList<Menu> menus, int index) {
Menu menu = menus.get(index);
String text = menu.getText();
if (text == null || "".equals(text)) {
return getMenuTextFromIcon(menu, index);
}
return text;
}
public String getTextForMenuItem(MenuItem menuItem, Menu parentMenu) {
int index = parentMenu.getItems().indexOf(menuItem);
String original = getMenuItemText(parentMenu, index);
String itemText = original;
int suffixIndex = 0;
for (int i = 0; i < index; i++) {
String current = getMenuItemText(parentMenu, i);
if (current.equals(original)) {
itemText = String.format("%s(%d)", original, ++suffixIndex);
}
}
return itemText;
}