2012-04-25 55 views
10

Estoy haciendo un MenuBar, y quiero la funcionalidad de presionar un Menu como: "Archivo" y luego ejecutar una acción. Tales como abrir otro fxml, o un ejemplo donde se escribe alguna salida.JavaFX 2.0 Activando un menú como un elemento de menú

Quiero la funcionalidad de un MenuItem (mienten "Acerca de") en un Menu como "Archivo".

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); 
    } 
} 

Respuesta

14

yo sepa, un Menu, si no se ha añadido ningún submenú o Menuitem s, no se dispara eventos ni en clic, en demostrado ni en ocultar. Sin embargo, la solución es establecer su gráfico donde este nodo gráfico se encargará de clics del ratón, por ejemplo,

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); 

Un inconveniente de este enfoque es que la etiqueta no cubren todos los espacios de la menú que aparece al hacer clic en bordes de menú es no activando el evento del mouse. Consulte esto al quitar el comentario de menuLabel.setStyle de la línea anterior. Pero esto se puede resolver jugando con los estilos CSS, creo.
El código está parcialmente tomado de Create Dialog using Stage. También puede cargar un archivo FXML en la etapa myDialog usando FXMLLoader. Hay muchos ejemplos al respecto en la red.

-2

Creo que no puede permitir ninguna acción en la etiqueta del menú principal.

Sin embargo, puede crear un panel de distribución y rellenarlo con texto y una barra de menú.

+0

Esto no es cierto ... –

3

Recientemente tuve el mismo problema, esto es lo que hice

@FXML private Menu myMenu; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 

    myMenu.setGraphic(
     ButtonBuilder.create() 
      .text("btnText") 
      .onAction(new EventHandler<ActionEvent>(){ 
       @Override public void handle(ActionEvent t) { 
        //TODO 
      } }) 
      .build() 
    ); 
} 
0

Recientemente se enfrentaron al mismo problema, esta fue mi manera de salir:

tuve un menuItem en el menú, que era comportarse como si se hiciera clic en el elemento del menú (en su caso File menú). Entonces, ¿qué se puede hacer es tener un menuItem Dummy_menuItem

final Menu fileMenu = new Menu("File"); 
fileMenu.getItems().add(new MenuItem("Dummy_menuItem")); 
menuBar.getMenus().add(fileMenu); 

y luego al hacer clic con File menú, disparar el Dummy_menuItem menuItem o cualquier funcionalidad que se desea tener. Para identificar qué menú debe tener esta propiedad, solía numberOfMenuItems para obtener el número de MenuItems en los menús en el menú de

if (numberOfMenuItems == 1) { 
    menu.showingProperty().addListener(
     (observableValue, oldValue, newValue) -> { 
      if (newValue) { 
       // the first menuItem is triggered 
       menu.getItems().get(0).fire(); 
      } 
     } 
    ); 
} 

el resultado es que el Dummy_menuItem se dispara sin el contexto que muestra la menuItem el clic de File menú o cualquier menú que tenga un elemento de menú. Por lo tanto, parece que hizo clic en el menú File y se redirigió a otra página o lo que sea.

Espero que esto ayude !!

0

combinación con la respuesta de nuestro amigo @Dota2, he construido una clase de ayuda a desencadenar onAction(Menu menu) caso de que el Menu 's incluso si no tiene ninguna MenuItem interior.Este es el método estático ayudante:

public static void onAction(Menu menu) 
{ 
    final MenuItem menuItem = new MenuItem(); 

    menu.getItems().add(menuItem); 
    menu.addEventHandler(Menu.ON_SHOWN, event -> menu.hide()); 
    menu.addEventHandler(Menu.ON_SHOWING, event -> menu.fire()); 
} 

Luego de llamar:

YourHelperClass.onAction(myMenu); 

Y listo! Espero que esto ayude.

Cuestiones relacionadas