2012-04-25 13 views
10

Sto facendo un MenuBar, e non voglio la funzionalità per premere un Menu come: "File" e quindi eseguire un'azione. Ad esempio aprire un altro fxml o un esempio in cui viene scritto un output.JavaFX 2.0 Attivare un Menu come un MenuId

Voglio la funzionalità di un MenuItem (si trova "Informazioni") in un Menu come "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); 
    } 
} 

risposta

14

per quanto ne so, un Menu, se non ha alcun sottomenu aggiunte o Menuitem s, non generare eventi né su clic, sulla mostrato nè sulla pelle. Tuttavia la soluzione è impostare la sua grafica in cui il nodo grafico gestirà clic del mouse, per esempio,

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

Uno svantaggio di questo approccio è che l'etichetta non coprono tutti gli spazi del menu risultante cliccando su bordi di menu è non attivando l'evento del mouse. Vedi questo rimarcando la riga menuLabel.setStyle qui sopra. Ma questo può essere risolto giocando con gli stili CSS che penso.
Il codice è parzialmente preso da Create Dialog using Stage. È inoltre possibile caricare un file FXML nella fase myDialog utilizzando FXMLLoader. Ci sono molti esempi in rete.

-2

Penso che non sia possibile consentire alcuna azione sull'etichetta del menu principale.

Tuttavia, è possibile creare uno stack e riempirlo con testo e una barra dei menu.

+0

Questo non è vero ... –

3

Recentemente ho avuto lo stesso problema, questo è quello che ho fatto

@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

Recentemente ho affrontato lo stesso problema, questa era la mia via d'uscita:

Ho avuto un menuItem nel menu, che era comportarsi come se si fa clic sul menuItem (nel tuo caso il menu File). Che cosa si può fare è avere una menuItem Dummy_menuItem

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

e poi al clic di File menù, il fuoco la Dummy_menuItem menuItem o qualsiasi funzionalità che si desidera avere. Per identificare quale menu dovrebbe avere questa proprietà, ho usato numberOfMenuItems per ottenere il numero di MenuItems nei menu nella barra dei menu

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

il risultato è che il Dummy_menuItem viene attivato senza il contesto visualizzare il menuItem al clic di File menu o qualsiasi menu che ha un menuItem. Sembra quindi che tu abbia fatto clic sul menu File e sia stato reindirizzato su un'altra pagina o altro.

Spero che questo aiuti !!

0

La combinazione con la risposta dal nostro amico @Dota2, ho costruito una classe di supporto per attivare onAction(Menu menu) evento s' il Menu anche se non ha alcun MenuItem all'interno.Ecco il metodo statico di supporto:

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

quindi si chiama:

YourHelperClass.onAction(myMenu); 

E pronto! Spero che aiuti.

Problemi correlati