2008-11-20 11 views
16

एक लिंक जो खड़ा है http://www.devdaily.com/blog/post/jfc-swing/handling-main-mac-menu-in-swing-application/ है हालांकि मैक ओएस एक्स के तहत मेनू बार पैकेज नाम के रूप में एप्लिकेशन नाम के विपरीत प्रदर्शित होता है। मैं बिना किसी किस्मत के उपरोक्त लिंक में कोड का उपयोग कर रहा हूं, इसलिए मुझे यकीन नहीं है कि हाल ही के मैक ओएस संस्करणों में कुछ भी बदल गया है।जावा में मैकोज़ एक्स के लिए मूल स्विंग मेनू बार समर्थन

public RootGUI() { 
    super("Hello"); 
    JMenuBar menuBar = new JMenuBar(); 
    JMenu file = new JMenu("File"); 
    JMenuItem item = new JMenuItem("Woah"); 
    file.add(item); 
    menuBar.add(file); 
    setJMenuBar(menuBar); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(100, 100); 
    pack(); 
    setVisible(true); 
} 
public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       System.setProperty("apple.laf.useScreenMenuBar", "true"); 
       System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       new RootGUI(); 
      } 
      catch(ClassNotFoundException e) { 
       System.out.println("ClassNotFoundException: " + e.getMessage()); 
      } 
      catch(InstantiationException e) { 
       System.out.println("InstantiationException: " + e.getMessage()); 
      } 
      catch(IllegalAccessException e) { 
       System.out.println("IllegalAccessException: " + e.getMessage()); 
      } 
      catch(UnsupportedLookAndFeelException e) { 
       System.out.println("UnsupportedLookAndFeelException: " + e.getMessage()); 
      } 

     } 
    }); 
} 

मेनू पट्टी में "परीक्षण" के रूप में प्रदर्शित करना चाहिए पर पहली मेनू आइटम, दुर्भाग्य से यह स्थिति नहीं है:

यहाँ एक उद्धरण है। दूसरी ओर, फ़ाइल मेनू ठीक काम करता है। कोई विचार?

+2

उह उन सभी अपवादों – brendan

+0

इस @brendan 4 साल पहले था, चलो हाँ देखो;) – Kezzer

उत्तर

21

@Kezzer

मुझे लगता है कि मैं देख रहा हूँ क्या हो रहा है। यदि आप मुख्य() विधि को विभिन्न वर्ग में डालते हैं, तो सब कुछ काम करता है। तो आपको कुछ की तरह कुछ चाहिए:

public class RootGUILauncher { 
    public static void main(String[] args) { 
    try { 
       System.setProperty("apple.laf.useScreenMenuBar", "true"); 
       System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch(ClassNotFoundException e) { 
       System.out.println("ClassNotFoundException: " + e.getMessage()); 
     } 
     catch(InstantiationException e) { 
       System.out.println("InstantiationException: " + e.getMessage()); 
     } 
     catch(IllegalAccessException e) { 
       System.out.println("IllegalAccessException: " + e.getMessage()); 
     } 
     catch(UnsupportedLookAndFeelException e) { 
       System.out.println("UnsupportedLookAndFeelException: " + e.getMessage()); 
     } 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new RootGUI(); 
     } 
    }); 
} 

और फिर अपनी रूटूजी कक्षा को एक अलग फ़ाइल में रखें।

+0

व्यवस्थापक सिर्फ इसलिए मेरी जड़ खाते में इस सूत्र का विलय कर दिया मैंने इसे अब आपके लिए सही उत्तर के रूप में चिह्नित किया है :) – Kezzer

+0

Merci beaucoup :-) –

+0

@ मैट सोलनीट: मुझे भी एक ही समस्या थी। इस जवाब ने मेरी समस्या हल की। –

9

आपको मुख्य थ्रेड में "com.apple.mrj.application.apple.menu.about.name" सिस्टम प्रॉपर्टी सेट करने की आवश्यकता है, स्विंग थ्रेड में नहीं (दूसरे शब्दों में, बस इसे पहली पंक्ति बनाएं कार्यक्रम)।

3

जैसा कि मैं समझता हूं कि आप ओएस एक्स मेनू बार पर दिखाए गए अपने एप्लिकेशन मेनू का नाम बदलना चाहते हैं। खैर, मुझे सिस्टम प्रॉपर्टी नहीं मिली लेकिन मुझे कमांड लाइन विकल्प मिला:

-Xdock:name="YourNameHere" 

जो मेरे लिए काम करता था।

Btw: syystem संपत्ति com.apple.mrj.application.apple.menu.about.name आपके आवेदन मेनू में मेनू आइटम के बारे में नाम बदलने के लिए है, न ही मेनू पट्टी

this link यहाँ देखें (old link शायद सूर्य-ओरेकल-अधिग्रहण के बाद कभी-कभी मारा गया था)।

+1

link_ केवल इस मर चुका है –

+1

@Ben: धन्यवाद, अद्यतन लिंक – dhiller

0

@ मैट: दुर्भाग्य से यह मेरे लिए काम नहीं करता है।

public static void main(String[] args) { 
    try { 
     System.setProperty("apple.laf.useScreenMenuBar", "true"); 
     System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } 
    catch(ClassNotFoundException e) { 
     System.out.println("ClassNotFoundException: " + e.getMessage()); 
    } 
    catch(InstantiationException e) { 
     System.out.println("InstantiationException: " + e.getMessage()); 
    } 
    catch(IllegalAccessException e) { 
     System.out.println("IllegalAccessException: " + e.getMessage()); 
    } 
    catch(UnsupportedLookAndFeelException e) { 
     System.out.println("UnsupportedLookAndFeelException: " + e.getMessage()); 
    } 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new RootGUI(); 
     } 
    }); 
} 

यही है कि मैंने आपकी टिप्पणी के अलावा प्रयास किया था।

0

यदि आप मैक ओएस एक्स पर मूल दिखने वाले एप्लिकेशन को वितरित करना चाहते हैं, तो एक महत्वपूर्ण हिस्सा एक एप्लीकेशन बंडल प्रदान करना है। एप्लिकेशन बंडल के भीतर, आप इन समस्याओं को हल करने के लिए एक संपत्ति सूची फ़ाइल प्रदान करने में सक्षम होंगे।

कुछ अधिकारी जानकारी: Java Development Guide for Mac OS X

1

जब आप ऐप बनाते हैं तो आप Macify का भी उपयोग कर सकते हैं ताकि आपको कोई भी कोड बदलने की आवश्यकता न हो।

+1

मुझे वहां 503 मिलते हैं –

0

यदि आप एकाधिक जेएफआरएम्स लॉन्च कर रहे हैं और आप मैक मेनू का उपयोग कर रहे हैं, तो जेएफआरम्स में से एक जेएफआरएएम को बदल सकता है जिसे आप एक अलग मेनू संरचना के साथ चाहते हैं। मुझे यकीन नहीं है कि क्या आप एकाधिक जेएफआरम्स के लिए एक जेमेनूबार साझा कर सकते हैं, लेकिन आप केवल एक आवेदन विस्तृत मेन्यूबार बना सकते हैं कि सभी फ्रेम तत्काल हो जाएं।

0

किसी के भी इच्छुक व्यक्ति के लिए, हालांकि यह प्रश्न 6 साल का है, मुझे एक ही समस्या थी। स्विंग मेनू मैक देशी बार में प्रदर्शित नहीं होते हैं। मुझे एक आसान और अधिक सरल समाधान मिला ... बस अपने जेएफआरएएम को जावामेन के बजाय जावा.एवीटी मेनू घटक में जोड़ें और यह स्वचालित रूप से देशी मेनूबार में प्रदर्शित होगा!

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