2013-12-17 9 views
10

मैं javafx पर नौसिखिया हूँ। मैं राइट माउस क्लिक पर पॉपअप मेनू दिखाना चाहता हूं। मुझे एक ट्यूटोरियल Here और Here मिलता है लेकिन समझ में नहीं आता है। मैं पॉपअप मेनू बनाना चाहता हूं जो इस लिंक पर छवि में दिखाया गया है।पॉपअप मेनू कैसे बनाएं

अभी मैं मंच बना रहा हूं लेकिन मुझे मंच नहीं चाहिए। मुझे पॉपअप मेनू दिखाना होगा जो सही क्लिक पर दिखाएगा और जब भी मैं कहीं भी क्लिक करता हूं बंद करें।

यहां मेरा कोड है जिसमें मैं मंच का उपयोग कर रहा हूं लेकिन मुझे उपरोक्त लिंक जैसे पॉपअप मेनू को ओपे करना होगा।

public void MouseClickedOnTree(MouseEvent event) { 
if (event.isSecondaryButtonDown()) { 

     System.out.println("secondary press"); 
     final Stage optionstage = new Stage(); 

     VBox vBox = new VBox(5); 
     vBox.setMinHeight(50); 
     vBox.setMinWidth(50); 
     Button btnNewTestBed = new Button("New Testbed"); 
     btnNewTestBed.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       try { 
        optionstage.close(); 
        stage.show(); 
       } catch (IOException ex) { 
        Exceptions.printStackTrace(ex); 
       } 
      } 
     }); 
     Button btnOpenTestbed = new Button("Open Testbed"); 
     btnOpenTestbed.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       optionstage.close(); 

      } 
     }); 
     optionstage.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent t) { 
       if (t.getCode() == KeyCode.ESCAPE) { 
        System.out.println("click on escape"); 
        //Stage sb = (Stage) label.getScene().getWindow();//use any one object 
        if(optionstage.isShowing()) 
         optionstage.close(); 
       } 
      } 
     }); 

     vBox.getChildren().addAll(btnNewTestBed, btnOpenTestbed); 
     optionstage.setScene(new Scene(vBox, 100, 100)); 
     //stage.setScene(new Scene(new Group(new Text(50,50, "my second window")))); 
     optionstage.setX(event.getSceneX()); 
     optionstage.setY(event.getScreenY()); 
     optionstage.initStyle(StageStyle.UNDECORATED); 
     optionstage.show(); 

    } 

कृपया मुझे कोई लिंक या संदर्भ प्रदान करें।

उत्तर

20

आपके कोड का संदर्भ बहुत स्पष्ट नहीं है: क्या यह एक ईवेंट हैंडलर के अंदर है? यदि हां, तो यह एक ईवेंट हैंडलर क्या है? यदि नहीं, तो if कथन में event क्या है?

आपके द्वारा प्रदान किए गए दो लिंक बहुत जटिल हैं; जावाएफएक्स (स्विंग के विपरीत) में आपको केवल उन्नत उन्नत मामलों के लिए मौजूदा नोड कक्षाओं को उप-वर्गीकरण करना चाहिए। पॉपअप मेनू बनाने के लिए आपको जटिलता के इस स्तर की आवश्यकता नहीं है।

पॉपअप मेनू बनाने का सबसे आसान तरीका Control (या उपclass) के लिए है; तुम सिर्फ एक ContextMenu बनाने इसे करने के लिए MenuItem रों जोड़ने के लिए, और अपने नियंत्रण पर contextMenu के रूप में यह निर्धारित करने की आवश्यकता:

TextField textField = new TextField("Type Something"); // we will add a popup menu to this text field 
final ContextMenu contextMenu = new ContextMenu(); 
MenuItem cut = new MenuItem("Cut"); 
MenuItem copy = new MenuItem("Copy"); 
MenuItem paste = new MenuItem("Paste"); 
contextMenu.getItems().addAll(cut, copy, paste); 
cut.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent event) { 
     System.out.println("Cut..."); 
    } 
}); 
// ... 
textField.setContextMenu(contextMenu); 

आप एक नोड है कि एक Control (एक Pane है या नहीं पर एक ContextMenu उपयोग करना चाहते हैं एक Shape, उदाहरण के लिए), आप एक setContextMenu(...) विधि की जरूरत नहीं है, तो आप सिर्फ एक छोटे से अधिक काम की जरूरत है:

final AnchorPane pane = new AnchorPane(); 
// fill pane with nodes, etc 
// create context menu and menu items as above 
pane.setOnMousePressed(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     if (event.isSecondaryButtonDown()) { 
      contextMenu.show(pane, event.getScreenX(), event.getScreenY()); 
     } 
    } 
}); 

ContextMenu के लिए Javadocs या अधिक जानकारी के लिए tutorial देखें।

+0

लेकिन मैं इसे वृक्षदृश्य पर दिखाना चाहता हूं। मैं ट्रीव्यूव पर पॉपअप दिखाना चाहता हूं जब मैं ट्रीव्यू –

+0

पर राइट क्लिक करता हूं, मैं इस कोड का उपयोग करता हूं लेकिन पॉपअप 'contextMenu.show (soariteTree, event' नहीं दिखा रहा है।getScreenX(), event.getScreenY()); ' –

+0

क्षमा करें .. यह अभी काम कर रहा है .... मैंने घटना के बाहर घोषणा कोड रखा है, यह काम कर रहा है ... धन्यवाद .. –

10

जेम्स_D ने पहले ही ट्यूटोरियल के साथ एक कामकाजी उदाहरण प्रदान किया है, लेकिन मैं इसके साथ समस्याओं में भाग गया। जेम्स यह कहने में सही है कि किसी भी प्रकार के नोड के लिए संदर्भ मेनू खोलने का सही तरीका नियंत्रित करना Control.setContextMenu() का उपयोग करना है।

pane.addEventHandler(ContextMenuEvent.CONTEXT_MENU_REQUESTED, event -> { 
     contextMenu.show(pane, event.getScreenX(), event.getScreenY()); 
     event.consume(); 
    }); 
    pane.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> { 
     contextMenu.hide(); 
    }); 

यह setContextMenu पर्दे के पीछे क्या करता है के साथ संगत है: हालांकि गैर-नियंत्रण नोड्स एक संदर्भ मेनू इस प्रकार है (जावा 8) रजिस्टर करने के लिए सही तरीका ट्यूटोरियल के विपरीत। नियंत्रण के लिए setContextMenu कार्यान्वयन ContextMenuEvent का उपयोग करता है और उपभोग करता है लेकिन माउस ईवेंट का उपभोग करता है। इसका अर्थ यह है कि यदि आप एक पन पर MouseEvent के लिए श्रोता पंजीकृत करते हैं और फलक के भीतर नियंत्रण पर setContextMenu का उपयोग करते हैं तो नियंत्रण पर राइट क्लिक वास्तव में दोनों संदर्भ मेनू खोल देगा: कंट्रोल ConenxtMenuEvent के लिए सुनेंगे और उपभोग करेगा जबकि फलक सुनता है और MouseEvent खपत करता है। मैंने ओपनजेडके -8 के साथ अपने कोड में पाया कि फलक पर ContextMenuEvent श्रोता को पंजीकृत करने से यह डुप्लिकेट संदर्भ मेनू समस्या हल हो गई।

मैंने यह भी पाया कि जब उपयोगकर्ता कहीं और क्लिक करता है तो एक फलक पर पंजीकृत मेनू डिफ़ॉल्ट रूप से खारिज नहीं होता है। MOUSE_PRESSED श्रोता जो इसकी घटना का उपभोग नहीं करता है, यह सुनिश्चित करता है कि मेनू होने पर मेनू को खारिज कर दिया जाए।

+0

संदर्भ में फलक क्या है मेनू.शो (फलक ....); –

+0

यह वास्तव में उचित समाधान है। बहुत बुरा आप ऊपर नहीं हैं .. –

+0

नोड में एक setOnContextMenuRequested() विधि भी है –

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