2012-04-25 24 views
10

Robię MenuBar, i nie mam funkcji, aby nacisnąć przycisk Menu jak: "Plik", a następnie wykonać akcję. Takie jak otwieranie innego fxml lub przykład, w którym zapisywane są niektóre wyniki.JavaFX 2.0 Aktywowanie menu, takiego jak MenuItem

Chcę funkcji (kłamstwo "O") w Menu jak "Plik".

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

Odpowiedz

14

AFAIK, A Menu, jeśli nie każdy dodany podmenu lub Menuitem s, nie ogień ani na zdarzenia kliknięcia na pokazano ani na skórze. Jednak rozwiązaniem jest ustawienie jej grafikę gdzie to graficzny węzeł zajmie kliknięć myszką na przykład

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

Wadą tego podejścia jest to, że etykieta nie obejmują wszystkie przestrzenie menu wynikającej klikając na krawędziach menu jest nie wyzwalanie zdarzenia myszy. Zobacz to przez odkomentowanie powyższej linii menuLabel.setStyle. Ale można to rozwiązać, grając z stylami CSS, które myślę.
Kod jest częściowo pobierany z Create Dialog using Stage. Możesz także załadować plik FXML do etapu myDialog przy użyciu FXMLLoader. Istnieje wiele przykładów na ten temat w sieci.

-2

Myślę, że nie można zezwolić na żadną akcję na głównej etykiecie menu.

Można jednak utworzyć piętrę i wypełnić ją tekstem i paskiem menu.

+0

To nieprawda ... –

3

Ostatnio miałem ten sam problem, to co zrobiłem

@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

Niedawno w obliczu tego samego problemu, to była moja droga wyjścia:

miałem MENUITEM w menu, które było zachowywać się tak, jakby kliknięcie menuItem (w twoim przypadku menu File). Więc co można zrobić, to mieć MENUITEM Dummy_menuItem

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

a następnie kliknięciem File menu ogień Dummy_menuItem MENUITEM ani żadnej funkcjonalności, które chcesz mieć. Aby określić, które menu powinny mieć tę właściwość, użyłem numberOfMenuItems aby uzyskać liczbę elementów menu w menu w pasku menu

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

wynikiem jest to, że Dummy_menuItem jest wyzwalany bez kontekstu wyświetlającego MENUITEM na kliknięcie File menu lub dowolne menu z jednym menuItem. Wygląda to tak, jakbyś kliknął menu File i został przekierowany na inną stronę lub cokolwiek innego.

Mam nadzieję, że to pomoże!

0

połączeniu z odpowiedzią od naszego znajomego @Dota2, zbudowałem klasy pomocnika do wyzwalania onAction(Menu menu) zdarzenia jest Menu „s, nawet jeśli nie ma żadnego MenuItem wewnątrz.Oto metoda statyczna pomocnik:

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

Następnie zadzwonić:

YourHelperClass.onAction(myMenu); 

i gotowe! Mam nadzieję, że to pomoże.

Powiązane problemy