2011-08-22 13 views
114

another thread में मैं ने कहा कि मैं इस तरह कुछ कर रही द्वारा अपने GUIs केंद्रित करने के लिए इसे पसंद किया:स्विंग जीयूआई की सबसे अच्छी स्थिति कैसे करें?

JFrame frame = new JFrame("Foo"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().add(new HexagonGrid()); 
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 

लेकिन एंड्रयू थॉम्पसन एक अलग राय नहीं थी, बजाय

frame.pack(); 
frame.setLocationByPlatform(true); 

कॉल करने के लिए और पूछताछ करने के मन जानना चाहता हूँ क्यूं कर?

+1

असंबंधित: यदि आप मुझ पर एक एहसान कर सकते हैं इस [प्रश्न] को देखकर (https://stackoverflow.com/questions/46033958/java-switch-camera-front-back)। कुछ मौकों में से एक जहां मुझे लगता है कि सामग्री अधिक नीचे/बंद वोटों के लायक होगा .... – GhostCat

उत्तर

152

मेरी आंखों के लिए, स्क्रीन के बीच में एक जीयूआई ऐसा लगता है .. "स्पलैश-स्क्रीन'श"। मैं उनके लिए गायब होने का इंतजार कर रहा हूं और वास्तविक GUI दिखाई देने के लिए!

जावा 1.5 के बाद से हमारे पास Window.setLocationByPlatform(boolean) तक पहुंच है। जो ..

सेट करती है कि इस विंडो देशी विंडोइंग प्रणाली के लिए या वर्तमान स्थान (getLocation द्वारा दिया) अगली बार जब खिड़की से दिखाई दे जाता है पर डिफ़ॉल्ट स्थान पर दिखाई देनी चाहिए। यह व्यवहार बिना किसी प्रोग्रामेटिक रूप से अपना स्थान सेट किए दिखाए गए मूल विंडो जैसा दिखता है। अधिकांश विंडोिंग सिस्टम विंडोज़ को कैस्केड करते हैं यदि उनके स्थान स्पष्ट रूप से सेट नहीं होते हैं। स्क्रीन पर विंडो दिखाए जाने के बाद वास्तविक स्थान निर्धारित किया जाता है।

इस उदाहरण है कि डिफ़ॉल्ट स्थिति में 3 GUIs कहते हैं ओएस द्वारा चुना के प्रभाव पर एक नजर डालें - विंडोज 7 पर, Gnome & मैक ओएस एक्स के साथ लिनक्स

Stacked windows on Windows 7enter image description here Stacked windows on Mac OS X

(3 लॉट) 3 जीयू अच्छी तरह से ढेर। यह अंतिम उपयोगकर्ता के लिए 'कम से कम आश्चर्य का मार्ग' का प्रतिनिधित्व करता है, क्योंकि ओएस डिफ़ॉल्ट सादा-पाठ संपादक (या उस मामले के लिए कुछ भी) के 3 उदाहरणों को स्थिति दे सकता है। लिनक्स & मैक के लिए ट्रैशगोड का धन्यवाद। इमेजिस।

यहाँ सरल इस्तेमाल किया कोड है:

import javax.swing.*; 

class WhereToPutTheGui { 

    public static void initGui() { 
     for (int ii=1; ii<4; ii++) { 
      JFrame f = new JFrame("Frame " + ii); 
      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      String s = 
       "os.name: " + System.getProperty("os.name") + 
       "\nos.version: " + System.getProperty("os.version"); 
      f.add(new JTextArea(s,3,28)); // suggest a size 
      f.pack(); 
      // Let the OS handle the positioning! 
      f.setLocationByPlatform(true); 
      f.setVisible(true); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(
         UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) {} 
       initGui(); 
      } 
     }); 
    } 
} 
+1

@AndrewThompson सिर्फ 'i' के बजाय आपका काउंटर वैरिएबल' ii' क्यों है? क्या यह कुछ सम्मेलन का पालन करता है या क्या यह व्यक्तिगत वरीयता है (या शायद पूरी तरह से कुछ अलग)? – MirroredFate

+1

@ मिररफ़ेटफेट उम्म .. मुझे लगता है कि मैं विकल्प 3 में लॉक करूंगा, "कुछ पूरी तरह से अलग"। यह वही था जब मैंने पहली बार बेसिक में प्रोग्राम किया था (हाँ, बहुत समय पहले)। आलस्य यह निरंतर उपयोग का कारण है, 'अगर यह तोड़ नहीं है, इसे ठीक न करें'। –

+1

@MirroredFate क्या आप किसी भी मौके पर फारस फैन के राजकुमार हैं? मुझे इसे यहां रखने के लिए बहुत खेद है। मैं बस – Anarach

1

मैं पूरी तरह सहमत है कि setLocationByPlatform(true) एक नया JFrame की स्थिति निर्दिष्ट करने के लिए सबसे अच्छा तरीका है, लेकिन एक दोहरे मॉनिटर सेटअप आप मुद्दों में प्राप्त कर सकते हैं पर है। मेरे मामले में, बच्चा जेएफआरम 'अन्य' मॉनिटर पर पैदा हुआ है। उदाहरण: मैं स्क्रीन 2 पर अपने मुख्य जीयूआई है, मैं setLocationByPlatform(true) के साथ एक नया JFrame शुरू करने और यह स्क्रीन 1. तो यहाँ पर खुलता है एक और अधिक पूर्ण समाधान, मुझे लगता है:

 ... 
     // Let the OS try to handle the positioning! 
     f.setLocationByPlatform(true); 
     if(!f.getBounds().intersects(MyApp.getMainFrame().getBounds())) { 

      // non-cascading, but centered on the Main GUI 
      f.setLocationRelativeTo(MyApp.getMainFrame()); 
     } 
     f.setVisible(true); 
संबंधित मुद्दे