अपडेट 2013-06-21:इस उत्तर में कुछ समाधान और विकल्प शामिल हैं जो उपयोगी हो सकते हैं, लेकिन @sidney-markowitz-biomatters' उत्तर में सही कोड फिक्स है - LAF को ईवेंट थ्रेड से सेट करने की आवश्यकता है!उन्हें>
हाल की समस्याएं एक्वा लुक एंड फील (एलएएफ) को तोड़ने वाले अपडेट से संबंधित प्रतीत होती हैं, जो मैक ओएस एक्स पर स्विंग ऐप्स के लिए डिफ़ॉल्ट है।
अगर आपको एक्वा एलएएफ की जरूरत है तो बहुत अधिक विकल्प नहीं हैं। आपको ऐप्पल से अगले जावा अपडेट की प्रतीक्षा करनी पड़ सकती है (मुझे लगता है कि वे इसे प्राथमिकता के साथ ठीक कर देंगे, क्योंकि यह उनका अपना एलएएफ है)। आप जावा एप्लिकेशन बंडलर का उपयोग करने का भी प्रयास कर सकते हैं (यानी ओरेकल जेआरई को बंडल करें और सिस्टम के जेआरई का उपयोग करने से बचें)।
यदि आप एक अलग एलएएफ के साथ मिल सकते हैं तो आपका ऐप सामान्य रूप से काम करना चाहिए। यह पेपरकट के लिए किया था, कम से कम (003 अपडेट के कारण कुछ विंडो फोकस समस्याएं हुईं, 004 अपडेट ने तबाही मचाई)।
कुछ विकल्प:
-
जावा कोड (जैसे निंबस या मेटल) से जावा संस्करण-विशिष्ट क्रॉस प्लेटफॉर्म एलएएफ का उपयोग करना:
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
-
जावा कोड से विशिष्ट LAF सेट करना:
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
-
टर्मिनल से डिफ़ॉल्ट LAF को ओवरराइड करना:
java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
हमारे मामले में हम स्पष्ट रूप से कॉल कर रहे थे UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
हमारे कोड में और एक वर्कअराउंड चाहते थे जिसमें कोड परिवर्तन (यानी एक हॉटफिक्स) शामिल नहीं था, इसलिए हमें डिफ़ॉल्ट सिस्टम को ओवरराइड करने की आवश्यकता थी एलएएफ इस प्रकार है।
-
टर्मिनल से सिस्टम LAF को ओवरराइड करना:
java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
-
सिस्टम LAF को
Info.plist
से ओवरराइड करना फ़ाइल (यदि आपने मैक एप्लिकेशन के रूप में बंडल किया है, तो अन्य वीएम विकल्पों के लिए भी काम करता है) (उदाहरण के लिएMy.app/Contents/Info.plist
पर) )।आप
-Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
जोड़ना चाहते हैं अंत . तक<string>
काVMOptions
. के लिए मान<key>
. विकल्प स्थान से अलग होते हैं, बिल्कुल टर्मिनल की तरह। उदा. यदि आपके पास पहले से एकuseScreenMenuBar
है विकल्प:<key>VMOptions</key> <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
संपादित करें:@trashgod ने एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के लिए कहा। मुझे यकीन नहीं है कि 004 अपडेट के साथ आने वाली समस्याओं का पूरा दायरा क्या है, लेकिन यहां एक सरल पुनरुत्पादन है:
अपडेट 2013-06-21 - गलत तरीका, त्रुटि को पुन:प्रस्तुत करना:
public class AquaLafTest {
public static void main(String[] args) throws Exception {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
javax.swing.JOptionPane.showMessageDialog(null, "msg");
}
}
-
Apple JRE के साथ चलाएं जो 004 अपडेट के साथ आता है (जैसे
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
पर) ) ध्यान दें कि संदेश दिखाई नहीं दे रहा है, संवाद आइकन दिखाई नहीं दे रहा है और बटन दृश्यमान रूप से क्लिक करने योग्य नहीं है। -
पुराने Apple JRE या किसी अन्य JRE के साथ चलाएँ। ध्यान दें कि संवाद अपेक्षित रूप से प्रदर्शित होता है।
अपडेट 2013-06-21 - इवेंट थ्रेड पर सही तरीका, सही तरीके से काम करता है:
public class AquaLafTest {
public static void main(String[] args) throws Exception {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
try {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
javax.swing.JOptionPane.showMessageDialog(null, "msg");
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}