2012-04-05 15 views
23

पर केंद्र जेडियलॉग मेरे पास एक बटन के साथ जावा स्विंग एप्लिकेशन है जो एक निश्चित क्रिया के दौरान पॉपअप विंडो उत्पन्न करता है। मैं पॉपअप विंडो के केंद्र बिंदु को मूल विंडो के केंद्र बिंदु के साथ संरेखित करना चाहता हूं जब इसे प्रस्तुत किया जाता है। पॉपअप विंडो के लिए setLocation() में प्लग करने के लिए मैं x, y निर्देशांक की गणना कैसे कर सकता हूं?पेरेंट

बस स्पष्ट करने के लिए। मैं setLocationRelativeTo() का व्यवहार नहीं चाहता क्योंकि यह पॉपेंट के शीर्ष-बाएं पिक्सेल को मूल फ्रेम के केंद्र पिक्सेल पर सेट करता है। मैं मूल फ्रेम के केंद्र पिक्सेल पर पॉपअप का केंद्र पिक्सेल सेट करना चाहता हूं।

+1

एंड्रयू सच बोलता है! आपको 'JFrame' के बजाय' JDialog' का उपयोग करने पर विचार करना चाहिए। – Qwerky

+0

यह वास्तव में एक jdialog है। लेकिन क्या यह वास्तव में इस विशेष परिदृश्य के लिए महत्वपूर्ण है? मुझे बस एक्स और वाई की गणना की जरूरत है। –

उत्तर

41

setLocationRelativeTo ..this माता पिता के केंद्र पिक्सेल के ऊपर पॉपअप के ऊपर बाईं पिक्सेल सेट का विस्तार। ..

नहीं, यह नहीं है!

Centered Dialog

इस सरल उदाहरण से पॉप 3 संवादों से प्रत्येक जहाँ तक मैं देख सकता हूँ केंद्रित होना प्रतीत होता है। मैं केवल अनुमान लगा सकता हूं कि कोड गलत समय पर setLocationRelativeToपर कॉल कर रहा है।

import javax.swing.*; 

class CenterTheDialog { 

    CenterTheDialog() { 
     for (int ii=1; ii<4; ii++) { 
      JFrame f = new JFrame("Frame " + ii); 
      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

      f.setSize(400,300); 
      f.setLocationByPlatform(true); 
      f.setVisible(true); 

      JDialog d = new JDialog(f); 
      d.setSize(300,200); 
      d.setLocationRelativeTo(f); 
      d.setVisible(true); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      new CenterTheDialog(); 
     }); 
    } 
} 
+0

यह मेरे प्रोजेक्ट में हो रहा है, शायद किसी अन्य कारण से। मैं वास्तव में घृणा स्विंग करता हूँ। वैसे भी, फिलनेर्ड के जवाब ने मुझे (दयालु) मिला जो मैं खोज रहा था, इसकी गणना कैसे करें। मैंने उसका जवाब स्वीकार कर लिया है और मैं अगली बग पर हूं। धन्यवाद! –

+8

* ... गलत समय पर 'setLocationRelativeTo' को कॉल करना। *: हाँ, मैं इसे 'पैक() 'से पहले बुला रहा था! – bigstones

5
+0

यह माता-पिता के केंद्र पिक्सेल पर पॉपअप का शीर्ष बाएं पिक्सेल सेट करता है। मैं पॉपअप के केंद्र पिक्सेल को पैरेंट –

+1

@CrhsiDrappier के केंद्र पिक्सेल पर सेट करना चाहता हूं क्या आप निश्चित हैं? 'तो खिड़की इस तरह से स्थित है कि खिड़की का केंद्र घटक के केंद्र के साथ मेल खाता है।' – Jeffrey

+0

* "क्या आप निश्चित हैं?" * ओपी निश्चित रूप से गलत है, जैसा कि मेरे उदाहरण में दिखाया गया है जो आपके उत्तर का विस्तार करता है। ओटीओएच वे अपने सिर को रेत में गहरी दफन रखने के लिए दृढ़ प्रतीत होते हैं, इसलिए ..(shrugs) –

2

आप माता-पिता खिड़की के निर्देशांक और नई विंडो को उसके आकार से गुजर रहा है और प्रत्येक अक्ष में निर्देशांक + 1/2 माता पिता फ्रेम आकार जोड़ने की कोशिश कर सकते हैं - पॉपअप का 1/2 x/y केंद्र पर केंद्र करने के लिए।

Or..If क्या आप setLocationRelativeTo (स्वामी)

आशा इस्तेमाल कर सकते हैं इस में मदद करता है

+0

यह माता-पिता के केंद्र पिक्सेल पर पॉपअप का शीर्ष बाएं पिक्सेल सेट करता है। मैं माता-पिता –

+0

के केंद्र पिक्सेल पर पॉपअप का केंद्र पिक्सेल सेट करना चाहता हूं, अगर आपने मेरे सूत्र का पालन करने का निर्णय लिया है तो आप एक्स/वाई पॉपअप आकार के अतिरिक्त 1/2 से भी कम कर सकते हैं। – Phil

+0

अपनी टिप्पणियों को अपने उत्तर में जोड़ें और मैं स्वीकार करूंगा। यह सही नहीं है, लेकिन मुझे लगता है कि मेरे पास अन्य चीजें हो रही हैं जो परिणाम को प्रभावित कर रही हैं। मैं वास्तव में यहां अपनी पूरी परियोजना पोस्ट नहीं करना चाहता हूं। धन्यवाद। –

45

पर JDialog आपके द्वारा बनाया गया आप pack() पहले, तो setLocationRelativeTo(parentFrame), और फिर setVisible(true) फोन करना चाहिए। उस क्रम के साथ JDialog पैरेंट फ्रेम पर केंद्रित होना चाहिए।

आप पहली बार pack() फोन नहीं करते हैं, तो सेटिंग को पैरेंट को स्थान रिश्तेदार ठीक से काम नहीं करता है क्योंकि JDialog पता नहीं है क्या आकार यह उस बिंदु पर है। ऐसा लगता है कि आकार 0 से 0 के रूप में लेता है, जिसके परिणामस्वरूप "उत्तर के पिक्सेल पर पॉपअप के शीर्ष बाएं पिक्सेल" को अन्य उत्तरों में से किसी एक टिप्पणी में उल्लिखित स्थिति में वर्णित किया जाता है।

+1

यह मेरे लिए पूरी तरह से काम किया। धन्यवाद एमबी! –

1

आप पैरेंट विंडो प्राप्त करने के लिए ईवेंट e का उपयोग कर सकते हैं। getWindowAncestor और e.getSource() का उपयोग करें।

dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))

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