2012-04-25 6 views
10

Je crée un MenuBar, et je n'ai pas la possibilité d'appuyer sur un Menu comme: "Fichier", puis d'exécuter une action. Tels que l'ouverture d'un autre fxml, ou un exemple où une sortie est écrite.JavaFX 2.0 Activer un menu comme un élément de menu

Je veux la fonctionnalité d'un MenuItem (mensonge "About") dans un Menu comme "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); 
    } 
} 

Répondre

14

AFAIK, A Menu, si n'a pas de sous-menu ajouté ou Menuitem s, ne se déclenche pas les événements ni sur un clic, sur indiqué, ni sur peau. Cependant, la solution consiste à définir son graphique où ce nœud graphique se chargera des clics de souris par exemple,

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 inconvénient de cette approche est que l'étiquette ne couvre pas tous les espaces du menu qui cliquant sur les bords du menu ne déclenche pas l'événement de la souris. Voir cela en décommentant menuLabel.setStyle ligne ci-dessus. Mais cela peut être résolu en jouant avec CSS styles je pense. Le code est partiellement tiré de Create Dialog using Stage. Vous pouvez également charger un fichier FXML dans l'étape myDialog en utilisant le FXMLLoader. Il y a beaucoup d'exemples à ce sujet sur le net.

-2

Je pense que vous ne pouvez autoriser aucune action sur l'étiquette du menu principal.

Toutefois, vous pouvez créer une pile et le remplir avec du texte et une barre de menus.

+0

Ce n'est pas vrai ... –

3

j'ai récemment eu le même problème, c'est ce que je l'ai fait

@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

Récemment, je fait face à la même question, ce fut mon chemin:

J'ai eu un ligneMenu dans le menu, qui était se comporter comme si le menuItem est cliqué (dans votre cas, le menu File). Donc ce que vous pouvez faire est d'avoir un ligneMenu Dummy_menuItem

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

et puis cliquez menu au File, feu le Dummy_menuItem ligneMenu ou toutes les fonctionnalités que vous souhaitez avoir. Pour identifier le menu qui doit avoir cette propriété, je numberOfMenuItems pour obtenir le nombre de menuItems dans les menus dans la barre de menus

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

le résultat est que la Dummy_menuItem est déclenchée sans le contexte affichant le ligneMenu sur clic de menus File ou n'importe quel menu qui a un menuItem. Il semble donc que vous avez cliqué sur le menu File et que vous avez été redirigé vers une autre page ou autre.

Espérons que cela aide !!

0

La combinaison avec la réponse de notre ami @Dota2, j'ai construit une classe d'aide pour déclencher l'événement de onAction(Menu menu)Menu même si elle n'a pas MenuItem l'intérieur.Voici la méthode d'aide statique:

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

Ensuite, vous appelez:

YourHelperClass.onAction(myMenu); 

Et prêt! J'espère que ça aide.

Questions connexes