2012-08-25 39 views
7

पर जेमेनूबार सक्रिय करें JMenuBar JMenuItem एस को दिखाना शुरू नहीं करता है या JMenu पॉपअप प्रदर्शित करता है जब तक कि इसे पहले क्लिक नहीं किया जाता है। JMenuBar में कहीं भी क्लिक करने के बाद, ये सभी आइटम माउस hovers का जवाब देते हैं।होवर

मैं प्रारंभिक क्लिक को बाईपास करना चाहता हूं और इसे माउस होवर पर स्वचालित रूप से सक्रिय करना चाहता हूं। क्या इसे करने का कोई तरीका है?

+3

कोई अच्छा कारण है कि आप ऐसा क्यों करना चाहते हैं? सभी अनुप्रयोगों में सभी मेनूबार – Robin

+0

की तरह व्यवहार करते हैं वैसे मेरे मेनू में एक कस्टम रूप है और यह व्यवहार इसे अधिक स्वाभाविक रूप से फिट करता है। साथ ही, मेरा मानना ​​है कि यह व्यवहार उपयोगकर्ता के लिए बहुत अधिक इंटरैक्टिव है। – springcorn

उत्तर

9

पर जोड़ने और mouseEntered पर ईवेंट सुनना है। ईवेंट हैंडलर में, आपको doClick का उपयोग करके बस उस पर क्लिक करना होगा। उदाहरण के लिए,

jMenuFile.addMouseListener(new MouseListener(){ 
    public void mouseEntered(MouseEvent e) { 
     jMenuFile.doClick(); 
    } 
    ... 
}); 

एक बार प्रोग्राम के रूप में माउस पर क्लिक किया दर्ज किया गया है, यह पॉपअप मेनू स्वचालित रूप से खुलता है। पूरे JMenuBar को सक्रिय करने के लिए, आपको प्रत्येक JMenu पर एक श्रोता जोड़ना होगा। इस उद्देश्य के लिए, श्रोता ऑब्जेक्ट को अलग से बनाना बेहतर है।

मैं पट्टी पर दो मेनू आइटम है, तो मैंने किया:

MouseListener ml = new MouseListener(){ 
    public void mouseClicked(MouseEvent e) {} 
    public void mousePressed(MouseEvent e) {} 
    public void mouseReleased(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) { 
     ((JMenu)e.getSource()).doClick(); 
    } 
    }; 
    jMenuFile.addMouseListener(ml); 
    jMenuHelp.addMouseListener(ml); 

आप बार पर इतने सारे मेनू आइटम है, तो आप बस इसे पुनरावृति कर सकते हैं:

for (Component c: jMenuBar1.getComponents()) { 
    if (c instanceof JMenu){ 
     c.addMouseListener(ml); 
    } 
} 
+0

मैं माउस एन्टर श्रोता को समझता हूं लेकिन आप पूरे जेमेनूबार को मॉसेंटर से कैसे सक्रिय करते हैं? – springcorn

+0

बस –

+0

से ऊपर संपादित किया गया धन्यवाद। इससे मुझे सही रास्ते पर रखा गया, लेकिन मुझे लगता है कि मैं उम्मीद कर रहा था कि क्लिक करने के बजाय व्यक्तिगत रूप से jMenuBar.activate() की तरह ऐसा करने का एक आसान तरीका था। JMenuItem के लिए आप doClick() को कॉल नहीं कर सकते हैं, इसके बजाय मुझे विश्वास है कि इस व्यवहार को उत्पन्न करने का सबसे अच्छा तरीका सेट है आर्मेड (सत्य) – springcorn

1

रोमन सी शुरुआती और स्वीकार्य उत्तर ऑटो नहीं होगा JMenuBar के हिस्से के रूप में बच्चे मेनू Items के साथ मेनू बंद करें।

रनिंग ((जेमेनू) e.getSource())। DoClick(); माउस पर क्लिक किया गया जेएमएनयू माता-पिता में से किसी एक में क्लिक को अनुकरण करता है लेकिन इसे माउस एक्स्प्लिटेड विधि में जोड़ा नहीं जा सकता है क्योंकि माउस लिस्टनर को बच्चे मेन्यूटम्स के साथ-साथ जेमेनू माता-पिता से जुड़ा होना चाहिए। (जो यह मेनूबार के सामान्य असाइनमेंट में नहीं करता है - केवल माता-पिता जेमेनू ऑब्जेक्ट्स को जोड़ता है)।

इसके अतिरिक्त, माउसएक्सिट श्रोता को "बंद" विधि को आग लगाने की कोशिश करने के कारण केवल एक समस्या उत्पन्न होती है जब माउस ने पूरी मेनू संरचना (यानी बाल मेनू ड्रॉपडाउन) छोड़ी है।

नीचे एक पूरी तरह से काम कर जवाब मेरे लाइव ऐप्स से लिया जाता है:

तरह से मैं मेनू माउस बाहर पर करीब हल निर्माता के शीर्ष में एक बूलियन चर "isMouseOut" चलाने के लिए ट्रैक रखने के लिए था , और उसके बाद मेनू के साथ इंटरैक्ट करते हुए एकाधिक माउसइन-माउसऑट घटनाओं का ट्रैक रखने के लिए माउस ओलिफ़ोनर को अधिक ओओ दोस्ताना तरीके से आवंटित करें। जो बुलियन "isMouseOut" की स्थिति पर कार्य कर रहे एक अलग मेनू क्लीयर विधि को कॉल करता है। कक्षा MouseListener लागू करता है। इस तरह यह किया गया है।

पहले इस मेनू में सभी मेनू आइटम जोड़कर एक ऐरेलिस्ट बनाएं।इसलिए जैसा: मेनूबार के लिए

for (Component c : aMenuItms) { 
     if (c instanceof JMenuItem) { 
      c.addMouseListener(ml); 
     } 
    } 

अब सेट JMenu माता-पिता:

// Now set JMenu parents on MenuBar 
    final JMenu mnFile = new JMenu("File"); 
    menuBar.add(mnFile).setFont(menuFont); 
    final JMenu mnView = new JMenu("View"); 
    menuBar.add(mnView).setFont(menuFont); 
    final JMenu mnHelp = new JMenu("Help"); 
    menuBar.add(mnHelp).setFont(menuFont); 

Font menuFont = new Font("Arial", Font.PLAIN, 12); 
    JMenuBar menuBar = new JMenuBar(); 
    getContentPane().add(menuBar, BorderLayout.NORTH); 

// Array of MenuItems 
    ArrayList<JMenuItem> aMenuItms = new ArrayList<JMenuItem>(); 
    JMenuItem mntmRefresh = new JMenuItem("Refresh"); 
    JMenuItem mntmNew = new JMenuItem("New"); 
    JMenuItem mntmNormal = new JMenuItem("Normal"); 
    JMenuItem mntmMax = new JMenuItem("Max"); 
    JMenuItem mntmStatus = new JMenuItem("Status"); 
    JMenuItem mntmFeedback = new JMenuItem("Send Feedback"); 
    JMenuItem mntmEtsyTWebsite = new JMenuItem("EtsyT website"); 
    JMenuItem mntmAbout = new JMenuItem("About"); 

    aMenuItms.add(mntmRefresh); 
    aMenuItms.add(mntmNew); 
    aMenuItms.add(mntmNormal); 
    aMenuItms.add(mntmMax); 
    aMenuItms.add(mntmStatus); 
    aMenuItms.add(mntmFeedback); 
    aMenuItms.add(mntmEtsyTWebsite); 
    aMenuItms.add(mntmAbout); 

तो इस स्तर के लिए() पाश का उपयोग कर एक MouseListener जोड़ने पर ArrayList से अधिक पुनरावृति फिर ड्रॉपडाउन मेनू जोड़ें बच्चों को जेमेनू माता-पिता के लिए दिखाएं:

// Now set menuItems as children of JMenu parents 
    mnFile.add(mntmRefresh).setFont(menuFont); 
    mnFile.add(mntmNew).setFont(menuFont); 
    mnView.add(mntmNormal).setFont(menuFont); 
    mnView.add(mntmMax).setFont(menuFont); 
    mnHelp.add(mntmStatus).setFont(menuFont); 
    mnHelp.add(mntmFeedback).setFont(menuFont); 
    mnHelp.add(mntmEtsyTWebsite).setFont(menuFont); 
    mnHelp.add(mntmAbout).setFont(menuFont); 

एक अलग कदम के रूप में JMenu माता पिता के लिए mouseListeners जोड़ें:

for (Component c : menuBar.getComponents()) { 
     if (c instanceof JMenu) { 
      c.addMouseListener(ml); 
     } 
    } 
अब जब कि बच्चे MENUITEM तत्वों सब अपने स्वयं के श्रोताओं कि माता-पिता JMenu तत्वों और मेनूबार में ही अलग हैं

- यह पहचान करने के लिए महत्वपूर्ण है माउस लिस्टनर() तत्कालता के भीतर ऑब्जेक्ट प्रकार ताकि आप माउसओवर पर मेनू ऑटो ओपनिंग प्राप्त कर सकें (इस उदाहरण में 3x जेमेनू माता-पिता) लेकिन बच्चे अपवाद त्रुटियों से बचाता है और मेनू संरचना के माउसओयूटी की साफ पहचान की अनुमति देता है, जहां निगरानी करने की कोशिश किए बिना माउस की स्थिति है। MouseListener इस प्रकार है:

MouseListener ml = new MouseListener() { 
     public void mouseClicked(MouseEvent e) { 
     } 

     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseExited(MouseEvent e) { 
      isMouseOut = true; 
      timerMenuClear(); 
     } 

     public void mouseEntered(MouseEvent e) { 
      isMouseOut = false; 
      Object eSource = e.getSource(); 
      if(eSource == mnHelp || eSource == mnView || eSource == mnFile){ 
       ((JMenu) eSource).doClick(); 
      } 
     } 
    }; 

ऊपर केवल माउस (इस उदाहरण में 3x) JMenu के माता-पिता 'में क्लिक करें रूप में वे बच्चे मेनू ड्रॉपडाउन के लिए ट्रिगर कर रहे हैं simulates। timerMenuClear() विधि खाली करने के लिए जो कुछ भी selectedpath बिंदु असली mouseout के समय लाइव था MenuSelectionManager पर कॉल:

public void timerMenuClear(){ 
    ActionListener task = new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if(isMouseOut == true){ 
       System.out.println("Timer"); 
      MenuSelectionManager.defaultManager().clearSelectedPath(); 
      } 
     } 
    };   
    //Delay timer half a second to ensure real mouseOUT 
    Timer timer = new Timer(1000, task); 
    timer.setInitialDelay(500);   
    timer.setRepeats(false); 
    timer.start(); 
} 

यह मुझे एक छोटे से परीक्षण ले लिया, निगरानी क्या मैं अपने विकास के दौरान JVM के भीतर पहुंच पा रहे थे महत्व देता है - लेकिन यह एक इलाज करता है! नेस्टेड मेनू के साथ भी :) मुझे आशा है कि कई लोग इस पूर्ण उदाहरण को बहुत उपयोगी पाते हैं।