सबसे अच्छी स्थिति स्विंग GUIs कैसे करें?


126

में एक और धागा मैं ने कहा कि मैं इस तरह कुछ कर रही द्वारा अपने 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);

और पूछताछ करने वाले दिमाग जानना चाहते हैं कि क्यों?


गुई को उसी स्थान पर शुरू करना चाहिए जो पिछली बार समाप्त हो गया था।
नोमैडमेकर

जवाबों:


167

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

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

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

इस उदाहरण के प्रभाव पर एक नज़र डालें जो ओएस द्वारा चुने गए डिफ़ॉल्ट पदों में 3 जीयूआई डालता है - विंडोज 7 पर, ग्नोम और मैक ओएस एक्स के साथ लिनक्स।

विंडोज 7 पर स्टैक्ड विंडो यहाँ छवि विवरण दर्ज करें मैक ओएस एक्स पर स्टैक्ड विंडो

(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 आपके काउंटर वेरिएबल को iiकेवल के बजाय क्यों बनाया गया है i? क्या यह कुछ सम्मेलन का पालन करता है या यह एक व्यक्तिगत प्राथमिकता है (या शायद कुछ पूरी तरह से अलग है)?
दर्पण

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

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

11
@MirroredFate यहाँ मैं iiइसके बजाय का उपयोग क्यों कर रहा हूँ i। जब मैं प्रोग्रामिंग प्रतियोगिताओं में भाग लेता हूं, तो मुझे अक्सर एक त्रुटि द्वारा ठीक करने के लिए लूप इंडेक्स को खोजने, कहने +1या -1इसके लिए खोज करनी होती है। उन मामलों में, खोज iiकरना बहुत आसान है i, चाहे मैं किसी भी संपादक का उपयोग करूं। इसी तरह, मैं नेस्टेड लूप इंडेक्स के लिए उपयोग करता हूं jjऔर करता हूं kk। :)
musically_ut

5

मैं पूरी तरह से सहमत हूं कि setLocationByPlatform(true)एक नया JFrame की स्थिति को निर्दिष्ट करने का सबसे अच्छा तरीका है, लेकिन दोहरे-मॉनिटर सेटअप में आप मुद्दों पर पहुंच सकते हैं। मेरे मामले में, बच्चे JFrame को 'अन्य' मॉनिटर पर रखा गया है। उदाहरण: मेरे पास स्क्रीन 2 पर मेरा मुख्य GUI है, मैं एक नया JFrame शुरू करता हूं setLocationByPlatform(true)और यह स्क्रीन 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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.