2012-04-25 17 views
10

मैं MenuBar बना रहा हूं, और Menu दबाकर कार्यक्षमता नहीं है: "फ़ाइल" और फिर एक क्रिया निष्पादित करें। ऐसा कोई अन्य fxml खोलना, या एक उदाहरण जहां कुछ आउटपुट लिखा गया है।जावाएफएक्स 2.0 मेनू मेनू जैसे मेनू को सक्रिय करना

मुझे 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, एक Menu, नहीं तो किसी भी जोड़ा सबमेनू या Menuitem रों, न तो क्लिक पर पता चला पर और न ही छिपाने पर घटनाओं आग नहीं करता है। हालांकि वैकल्पिक हल अपने ग्राफिक जहां इस ग्राफिक नोड उदाहरण के लिए माउस क्लिक संभाल लेंगे,

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 से लिया गया है। FXMLLoader का उपयोग कर myDialog चरण में आप FXML फ़ाइल भी लोड कर सकते हैं। नेट पर इसके बारे में बहुत सारे उदाहरण हैं।

-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 संदर्भ File मेनू के क्लिक पर MENUITEM प्रदर्शित किए बिना शुरू हो रहा है या कोई मेनू जिसमें एक मेनू है। तो ऐसा प्रतीत होता है जैसे आपने File मेनू पर क्लिक किया था और किसी अन्य पृष्ठ या जो भी हो, पर रीडायरेक्ट किया गया था।

उम्मीद है कि इससे मदद मिलती है !!

0

हमारे दोस्त @Dota2 से जवाब के साथ संयोजन, मैं भले ही वह किसी भी MenuItem अंदर नहीं है Menu के onAction(Menu menu) घटना को गति प्रदान करने के लिए एक सहायक वर्ग का निर्माण किया।

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

और तैयार यहाँ स्थिर सहायक विधि है! आशा है कि ये आपकी मदद करेगा।

संबंधित मुद्दे