2012-04-25 2 views
10

Я делаю MenuBar, и я не хочу использовать функцию Menu как «Файл», а затем выполнить действие. Такие, как открытие другого fxml, или пример, где записывается какой-то вывод.JavaFX 2.0 Активация меню как MenuItem

Я хочу функциональность MenuItem (ложь «О») в Menu как «Файл».

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

ответ

14

AFAIK, A Menu, если не какой-либо добавлено подменю или Menuitem s, не срабатывают события ни по щелчку, по показано ни на шкурой. Однако обходной путь, чтобы установить его графическое изображение, где этот графический узел будет обрабатывать щелчки мыши, например,

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. Вы также можете загрузить файл FXML на этап myDialog, используя FXMLLoader. В Сети есть много примеров.

-2

Я думаю, что вы не можете разрешить какие-либо действия на ярлыке основного меню.

Однако вы можете создать стек стека и заполнить его текстом и панелью меню.

+0

Это неправда ... –

3

Недавно я была такая же проблема, это то, что я сделал

@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

Недавно я столкнулся с такой же вопрос, что это был мой выход:

У меня был MENUITEM в меню, которое было вести себя так, как если бы щелкнул элемент меню (в вашем случае File). Так что вы можете сделать, это есть MENUITEM Dummy_menuItem

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

, а затем по щелчку File меню, огонь Dummy_menuItem MENUITEM или какой-либо функциональности вы хотите иметь. Для того, чтобы определить, какое меню должно обладать этим свойством, я использовал numberOfMenuItems, чтобы получить число MenuItems в меню в строке меню

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

результат в том, что Dummy_menuItem срабатывает без контекста, отображающей MENUITEM на щелчок File меню или любое меню с одним элементом меню. Таким образом, кажется, что вы нажали меню File и были перенаправлены на другую страницу или что-то еще.

Надеюсь, что это поможет!

0

Объединения с ответом от нашего друга @Dota2, я построил вспомогательный класс для запуска Menu «s onAction(Menu menu) события, даже если он не имеет какие-либо MenuItem внутри.Вот статический вспомогательный метод:

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

Тогда вы звоните:

YourHelperClass.onAction(myMenu); 

И готов! Надеюсь, это поможет.