2010-08-13 6 views
9

नमूना कोड:जावा: JFrame.setLocationRelativeTo (शून्य) OpenJDK साथ उबंटू 10.04/सूक्ति 2.30.2 पर खिड़की केंद्रित नहीं 1.6.0_18

JFrame jFrame = new JFrame("Test"); 
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jFrame.setLocationRelativeTo(null); 
    jFrame.setSize(600, 600); 
    jFrame.pack(); 
    // jFrame.setLocationRelativeTo(null); // same results 
    jFrame.setVisible(true); 

screenshot http://img193.imageshack.us/img193/5296/screenshotrev.png

इस OpenJDK की गलती है? मुझे याद है कि यह सूर्य के जितना अच्छा नहीं था, लेकिन चूंकि यह उबंटू के लिए मानक बन गया या जो भी मैंने इसके साथ जाने का फैसला किया। कार्यक्रम शायद विंडोज़ पर चलने वाला है, इसलिए मुझे लगता है कि मुझे वहां जांचना होगा ... इसे किसी भी प्लेटफॉर्म में इसे ठीक किए बिना स्वतंत्र तरीके से इसे ठीक करने का कोई आसान तरीका है जहां यह पहले से ही काम करता है?

+0

आप में स्क्रीनशॉट, ऊपरी-बाएं कोने पूरी तरह से केंद्रित है। आपको फ्रेम की ऊंचाई और चौड़ाई से इसे ऑफ़सेट करने की आवश्यकता है। – jjnguy

+6

इवान द्वारा बताए गए अनुसार, यह कोड कोड में बहुत जल्दी सेटोकेशनरेलेटिव() को कॉल कर रहा है। यह ** पैक()/setSize() के बाद ** किया जाना चाहिए। यह भी ध्यान रखें कि आपके उदाहरण और इवान दोनों में, सेट आकार() को कॉल करना तुरंत अनावश्यक है यदि पैक() के तुरंत बाद। –

उत्तर

4

एक तरीका है कि मैन्युअल रूप से विंडो को स्थितिबद्ध करना है। pack() पर अपनी कॉल के बाद निम्न कोड डालें।

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
Point middle = new Point(screenSize.width/2, screenSize.height/2); 
Point newLocation = new Point(middle.x - (jFrame.getWidth()/2), 
           middle.y - (jFrame.getHeight()/2)); 
jFrame.setLocation(newLocation); 

अस्वीकरण, यह केवल खिड़कियों पर परीक्षण किया गया था।

इसके अलावा, आपको हमेशा setSize() के बजाय setPreferredSize() का उपयोग करना चाहिए।

+0

वही बात होती है। मुझे आश्चर्य है कि यह मेरा मॉनिटर है? –

+0

@ कैप्टन, आपको अपने प्रश्न के समान परिणाम मिलते हैं? – jjnguy

+0

@ जस्टिन येप: (( –

19
JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
//jFrame.setLocationRelativeTo(null); 
jFrame.setSize(600, 600); 
jFrame.pack(); 
jFrame.setVisible(true); 
jFrame.setLocationRelativeTo(null); //To center the code 

यह समस्या ठीक करें और JFrame

+5

मूल रूप से, setLocationRelativeTo() से पहले पैक पैक() ऐसा इसलिए है क्योंकि पैक() विंडो के आकार की गणना करता है, जो कि केंद्र गणना को सही ढंग से करने के लिए आवश्यक है। –

3
jFrame.validate(); 

यह वास्तव में बेहतर के बाद से पैक फ्रेम आकार बदल सकते हैं काम करता है केंद्रित हो जाएगा, जबकि validate फ्रेम आकार अकेला छोड़ देता है।

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन setLocationRelativeTo() काम करेगा लेकिन इसे पैक() के बाद बुलाया जाना चाहिए। फ़्रेम की getWidth() और getHeight() पैकिंग के बाद अलग-अलग (सही) मान लौटाते हैं और यही कारण है कि ओपी केंद्र में असमर्थ है।

3

बस एक परिशुद्धता: यदि आप फ्रेम के आकार से पहले स्थान सेट करते हैं, तो आप विंडो के ऊपरी बाएं कोने को केंद्र में रखेंगे क्योंकि आकार (0,0) है। आपको स्थान से पहले आकार सेट करना होगा।

JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jFrame.setSize(600, 600); 
jFrame.pack(); 
jFrame.setLocationRelativeTo(null); 
jFrame.setVisible(true); 

यह ओपनजेडीके -6 और उबंटू 13.04 के साथ मेरे साथ अच्छा काम करता है। इसे अन्य प्लेटफ़ॉर्म पर आज़माएं।

+0

एसओ में आपका स्वागत है! क्या आप कृपया अपना उत्तर कोड नमूना के साथ विस्तारित कर सकते हैं? – Brian

+1

धन्यवाद। हां, ज़ाहिर है, मैं मैं अपना जवाब संपादित करूंगा। (मेरी अंग्रेजी के लिए खेद है, मैं कंप्यूटर विज्ञान में एक फ्रांसीसी छात्र हूं) – YoannFleuryDev

0

आपको संबंधित स्थान देने से पहले jFrame आकार घोषित नहीं करना चाहिए। यदि आप ऐसा करते हैं तो ऐसा होता है कि वह आपके आईफ्रेम को दिए गए स्थान से दूर खींच लेगा।

यह गलत है ----

JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jFrame.setLocationRelativeTo(null); 
jFrame.setSize(600, 600); 
jFrame.pack(); 
jFrame.setVisible(true); 

यह सही है ----

JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

//size comes first 
jFrame.setSize(600, 600); 

//and then the position 
jFrame.setLocationRelativeTo(null); 

jFrame.pack(); 
jFrame.setVisible(true); 
+0

आपकी टिप्पणियों में आपने कहा कि आकार पहले आता है तो आप 'जेएफआरएएम' को पैक करते हैं er 'setLocationRelativeTo' ... – Dan

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