我正在制作一个MenuBar,而且我无法按下菜单的功能:“File”,然后执行一个动作.就像打开一个其他的fxml,或者是一些写出一些输出的例子.
我想要一个MenuItem(在“About”)的功能,如“File”菜单.
package model; import static java.lang.System.out; import javafx.application.Application; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.geometry.Side; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; import javafx.scene.layout.BorderPane; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.Stage; /** * Example of creating menus in JavaFX. * * @author Dustin */ public class JavaFxMenus extends Application { /** * Build menu bar with included menus for this demonstration. * * @param menuWidthProperty Width to be bound to menu bar width. * @return Menu Bar with menus included. */ private MenuBar buildMenuBarWithMenus(final ReadOnlyDoubleProperty menuWidthProperty) { final MenuBar menuBar = new MenuBar(); // Prepare left-most 'File' drop-down menu final Menu fileMenu = new Menu("File"); menuBar.getMenus().add(fileMenu); //menuBar.getOnMouseClicked().handle(this); // Prepare 'Examples' drop-down menu final Menu examplesMenu = new Menu("JavaFX 2.0 Examples"); examplesMenu.getItems().add(new MenuItem("Text Example")); examplesMenu.getItems().add(new MenuItem("Objects Example")); examplesMenu.getItems().add(new MenuItem("Animation Example")); menuBar.getMenus().add(examplesMenu); // Prepare 'Help' drop-down menu final Menu helpMenu = new Menu("Help"); helpMenu.setOnAction(null); final MenuItem searchMenuItem = new MenuItem("Search"); searchMenuItem.setDisable(true); helpMenu.getItems().add(searchMenuItem); final MenuItem onlineManualMenuItem = new MenuItem("Online Manual"); onlineManualMenuItem.setVisible(false); helpMenu.getItems().add(onlineManualMenuItem); helpMenu.getItems().add(new SeparatorMenuItem()); final MenuItem aboutMenuItem = MenuItemBuilder.create() .text("About") .onAction( new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { out.println("You clicked on About!"); } }) .accelerator( new KeyCodeCombination( KeyCode.A,KeyCombination.CONTROL_DOWN)) .build(); helpMenu.getItems().add(aboutMenuItem); menuBar.getMenus().add(helpMenu); // bind width of menu bar to width of associated stage menuBar.prefWidthProperty().bind(menuWidthProperty); return menuBar; } /** * Start of JavaFX application demonstrating menu support. * * @param stage Primary stage. */ @Override public void start(final Stage stage) { stage.setTitle("Creating Menus with JavaFX 2.0"); final Group rootGroup = new Group(); final Scene scene = new Scene(rootGroup,800,400,Color.WHEAT); final MenuBar menuBar = buildMenuBarWithMenus(stage.widthProperty()); rootGroup.getChildren().add(menuBar); stage.setScene(scene); stage.show(); } /** * Main executable function for running examples. * * @param arguments Command-line arguments: none expected. */ public static void main(final String[] arguments) { Application.launch(arguments); } }
解决方法
AFAIK,A菜单,如果没有任何添加子菜单或Menuitems,则不会在点击,显示或隐藏上触发事件.但是,解决方法是设置其图形,其中该图形节点将处理鼠标点击,例如,
Label menuLabel = new Label("File"); menuLabel.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { Stage myDialog = new Stage(); myDialog.initModality(Modality.WINDOW_MODAL); Scene myDialogScene = new Scene(VBoxBuilder.create() .children(new Text("Hello! it's My Dialog.")) .alignment(Pos.CENTER) .padding(new Insets(10)) .build()); myDialog.setScene(myDialogScene); myDialog.show(); } }); Menu fileMenuButton = new Menu(); fileMenuButton.setGraphic(menuLabel); menuBar.getMenus().add(fileMenuButton);
这种方法的一个缺点是标签不覆盖菜单的所有空格,从而点击菜单边缘不会触发鼠标事件.通过取消注释menuLabel.setStyle行,看到这一点.但是,这可以通过使用我认为的CSS样式来解决.
代码部分取自Create Dialog using Stage.您还可以使用FXMLLoader将FXML文件加载到myDialog阶段.网上有很多例子.