2015-11-16 13 views
5

के लिए कक्षाओं को अलग दिखने और महसूस करने के लिए मैंने देखा कि जावा अलग-अलग रूपों का प्रस्ताव करता है और रूट और गैर-रूट उपयोगकर्ताओं के लिए कक्षाएं महसूस करता है। मैं यह समझने की कोशिश कर रहा हूं कि एलएएफ को कैसे सुसंगत बनाना है। इसके अलावा, यह भी एक उपयोगकर्ता/जड़ के भीतर असंगत है: निर्भर करता है कि उपयोगकर्ता/जड़ में लॉग इन पर:लिनक्स में जावा - रूट और गैर-रूट

नमूना कोड (संकलित और laf.jar में पैक):

import javax.swing.UIManager; 

public class laf { 
    public static void main(java.lang.String[] args) { 
     try { 
      System.out.print(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
     } 
    } 
} 

परिदृश्य में 1 लॉग्स नियमित उपयोगकर्ता के रूप (जीयूआई मोड में) मशीन

नमूना निर्गम (के रूप में उपयोगकर्ता)

[[email protected] Downloads]$ java -classpath laf.jar laf 
com.sun.java.swing.plaf.gtk.GTKLookAndFeel 

नमूना उत्पादन

नमूना निर्गम (के रूप में जड़ (स्विच जड़su के माध्यम से करने के लिए)

[[email protected] Downloads]# java -classpath ./laf.jar laf 
javax.swing.plaf.metal.MetalLookAndFeel 

मशीन में परिदृश्य 2 लॉग्स (जीयूआई मोड में) रूट के रूप में)

[[email protected] Downloads]# java -classpath ./laf.jar laf 
com.sun.java.swing.plaf.gtk.GTKLookAndFeel 

परिदृश्य 3 नियमित उपयोगकर्ता के रूप मशीन में लॉग SSH के माध्यम से (ऊपर # 1 परिदृश्य के रूप में समान है, लेकिन इस मामले में - एक ही एलएएफ)

नमूना निर्गम (के रूप में उपयोगकर्ता)

[[email protected] Downloads]$ java -classpath laf.jar laf 
javax.swing.plaf.metal.MetalLookAndFeel 

नमूना उत्पादन

[[email protected] Downloads]# java -classpath ./laf.jar laf 
javax.swing.plaf.metal.MetalLookAndFeel 

सॉफ्टवेयर ver (जड़ करने के लिए स्विच) वजहें:

[[email protected] Downloads]# java -version 
java version "1.7.0" 
Java(TM) SE Runtime Environment (build pxa6470sr9fp10-20150708_01(SR9 FP10)) 
IBM J9 VM (build 2.6, JRE 1.7.0 Linux amd64-64 Compressed References  20150701_255667 (JIT enabled, AOT enabled) 
J9VM - R26_Java726_SR9_20150701_0050_B255667 
JIT - tr.r11_20150626_95120.01 
GC - R26_Java726_SR9_20150701_0050_B255667_CMPRSS 
J9CL - 20150701_255667) 
JCL - 20150628_01 based on Oracle jdk7u85-b15 

[[email protected] Downloads]# cat /etc/redhat-release 
Red Hat Enterprise Linux Workstation release 6.7 (Santiago) 
+0

यह उपयोगकर्ता के पर्यावरण में एक अंतर से आ सकता है; विभिन्न परिदृश्यों के लिए 'env' के परिणाम को देखें और देखें, या जावा में,' System.getenv() 'के परिणाम का उपयोग करें। – fge

+0

क्या आप अपनी विभिन्न सेटिंग्स में जांच सकते हैं, भले ही आपके पास अपने पर्यावरण में 'GNOME_DESKTOP_SESSION_ID' चर हो? – RealSkeptic

+0

1) उपयोगकर्ता के रूप में यह कहा कि "इस-है-depricated" 2) के बाद "सु -" रूट के रूप में यह खाली उत्पादन –

उत्तर

0

getSystemLookAndFeelClassName की पहली पंक्ति है:

public static String getSystemLookAndFeelClassName() { 
    String systemLAF = AccessController.doPrivileged(
         new GetPropertyAction("swing.systemlaf")); 

तो तुम

-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel

डिफ़ॉल्ट के रूप में स्थापित करने के लिए उपयोगकर्ता की JAVA_OPTS उपयोग कर सकते हैं।

उपयोगकर्ता की .rc -File से जोड़ें:

set JAVA_OPTS=-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel 
export JAVA_OPTS 

सादर

+0

निश्चित रूप से, मैं गुणों के साथ प्रयास करूंगा, लेकिन मुझे आश्चर्य है कि यह बॉक्स से बाहर काम नहीं कर रहा है। –

+1

उपयोगकर्ता स्तर (bashrc या प्रोफ़ाइल) में संशोधन एक विकल्प नहीं था, क्योंकि हम इसे नियंत्रित नहीं करते हैं और नहीं चाहते कि हमारा एप्लिकेशन सिस्टम को प्रभावित करे।तो, मेरा समाधान एप्लिकेशन की स्टार्टअप स्क्रिप्ट में एक टुकड़ा जोड़ना है "-Dswing.systemlaf = javax.swing.plaf.metal.MetalLookAndFeel" –

+1

एक नोट बनाएं ** com.sun.javax.swing.plaf.metal.CrossPlatformLookAndFeel ** आईबीएम जेआरई में उपलब्ध नहीं है। तो यह एक क्रॉस-प्लेटफार्म समाधान नहीं है। मैं अभी भी पिछली टिप्पणी में जो उल्लेख किया है उसका उपयोग करने की अनुशंसा करता हूं: ** javax.swing.plaf.metal.MetalLookAndFeel ** –

1

यह वातावरण चर के बारे में जड़ के बारे में कम, और अधिक है।

असल में, UIManager.getSystemLookAndFeelClassName विधि इस तरह काम करता है:

  • चेक swing.systemlaf प्रणाली संपत्ति। यह उपयोगकर्ता को जो भी सिस्टम चुनना चाहता है उसे ओवरराइड करने की अनुमति देता है। यदि यह शून्य नहीं है, तो इसका उपयोग किया जाता है।
  • अन्यथा, यदि ऑपरेटिंग सिस्टम विंडोज है, यह WindowsLookAndFeel देता है।
  • अन्यथा, यह sun.desktop संपत्ति की जाँच करता है। यदि sun.desktopgnome पर सेट है, और जीटीके मूल रूप से उपलब्ध है, तो यह GTKLookAndFeel
  • अन्यथा, मैक ओएस एक्स और सोलारिस के लिए जांच करता है और इन ऑपरेटिंग सिस्टम के लिए उपयुक्त मान देता है।
  • सभी अन्य जांचों में विफल है, यह "पार मंच" एल & एफ, जो MetalLookAndFeel है देता है।

तो, लिनक्स/यूनिक्स के लिए प्रासंगिक हिस्सा वह हिस्सा है जो sun.desktop की जांच करता है। जब यह JVM शुरू होता है तो यह प्रॉपर्टी सेट होती है। यह gnome पर सेट है यदि पर्यावरण परिवर्तनीय GNOME_DESKTOP_SESSION_ID मौजूद है, इसकी सामग्री को अनदेखा कर रहा है, और यह अन्यथा शून्य करने के लिए सेट है। मुझे विश्वास है कि this is the pertinent native source code यह करता है।

तो, लिनक्स पर, यदि वह पर्यावरण चर सेट है (और जीटीके उपलब्ध है), तो आपका एल & एफ GTKLookAndFeel पर सेट किया जाएगा। यदि नहीं, तो यह MetalLookAndFeel पर सेट हो जाएगा।

जब आप डेस्कटॉप प्रबंधक का उपयोग कर एक ग्नोम आधारित लिनक्स में प्रवेश करें, अपने वातावरण चर सेट करना होगा। लेकिन su कमांड डिफ़ॉल्ट रूप से पर्यावरण चर प्रसारित नहीं करता है। इस प्रकार, जब आप किसी भी उपयोगकर्ता के लिए जरूरी नहीं हैं, जरूरी नहीं है, तो आप GNOME_DESKTOP_SESSION_ID पर्यावरण परिवर्तक खो देते हैं, और जावा MetalLookAndFeel पर डिफ़ॉल्ट होगा।

आप पैदा कर सकता है अपने वातावरण su के माध्यम से su -p का उपयोग करके पारित होने के लिए, या आप sudo उपयोग कर रहे हैं, sudo -E का उपयोग कर।

ssh कमांड, जैसे su और sudo, पर्यावरण चर का प्रचार नहीं करता है। इसे ~/.ssh/environment का उपयोग करके भी काम किया जा सकता है।

हालांकि, जैसा कि पहले से ही कहा गया है - आप -Dswing.systemlaf=... जावा कमांड पर स्विच करके आसानी से एक विशिष्ट एल & एफ को मजबूर कर सकते हैं।

+0

स्पष्टीकरण के लिए धन्यवाद, जैसा कि मैंने ऊपर बताया है GNOME_DESKTOP_SESSION_ID में कुछ भी सार्थक नहीं था। मेरा विकल्प स्पष्ट रूप से एलएएफ को डीडी –

+0

बीटीडब्ल्यू के माध्यम से परिभाषित करना था, यह समस्या उबंटू ओएस 12.04.02 पर भी देखी गई थी। हैरानी की बात है कि उबंटू पर मुझे बिल्कुल वही परिणाम मिलते हैं: उपयोगकर्ता ने यह कहा है कि echo $ GNOME_DESKTOP_SESSION_ID => "यह-वंचित" है, और रूट - रिक्त आउटपुट, और उपयोगकर्ता और रूट के रूप में विभिन्न LAFs। –

+0

@BaratSahdzijeu इसमें कुछ भी * सार्थक * शामिल नहीं है। जीटीके एल एंड एफ लेने के लिए यह सिर्फ अस्तित्व में है। और हाँ, उबंटू जीनोम आधारित लिनक्स है। – RealSkeptic

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