रोमन सी शुरुआती और स्वीकार्य उत्तर ऑटो नहीं होगा 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 के भीतर पहुंच पा रहे थे महत्व देता है - लेकिन यह एक इलाज करता है! नेस्टेड मेनू के साथ भी :) मुझे आशा है कि कई लोग इस पूर्ण उदाहरण को बहुत उपयोगी पाते हैं।
कोई अच्छा कारण है कि आप ऐसा क्यों करना चाहते हैं? सभी अनुप्रयोगों में सभी मेनूबार – Robin
की तरह व्यवहार करते हैं वैसे मेरे मेनू में एक कस्टम रूप है और यह व्यवहार इसे अधिक स्वाभाविक रूप से फिट करता है। साथ ही, मेरा मानना है कि यह व्यवहार उपयोगकर्ता के लिए बहुत अधिक इंटरैक्टिव है। – springcorn