जावा: घटकों में setPreferredSize () और setSize () विधियों के बीच अंतर


105

के बीच मुख्य अंतर क्या है setSize()और setPreferredSize()। कभी-कभी मैं इस्तेमाल करता था setSize(), कभी-कभी setPreferredSize(), एक जो मैं चाहता हूं, वह कभी-कभी करता है।

मुझे JFrames और JPanels के लिए किस कॉल का उपयोग करना चाहिए ?

जवाबों:


116

उपयोग इस बात पर निर्भर करता है कि घटक के माता-पिता के पास लेआउट प्रबंधक है या नहीं।

  • setSize() - जब अभिभावक लेआउट प्रबंधक मौजूद न हो तो उपयोग करें;
  • setPreferredSize()(इसके संबंधित setMinimumSizeऔर भी setMaximumSize) - एक अभिभावक लेआउट प्रबंधक मौजूद होने पर उपयोग करें।

setSize()अगर घटक के माता-पिता एक लेआउट प्रबंधक उपयोग कर रहा है विधि शायद कुछ नहीं करेंगे; स्थानों यह आम तौर पर एक प्रभाव शीर्ष स्तर के घटकों (पर होगा होगा JFrameऔर JWindowरों) और चीजें हैं जो स्क्रॉल शीशे के अंदर कर रहे हैं। setSize()यदि आपको लेआउट प्रबंधक के बिना माता-पिता के अंदर घटक मिल गए हैं तो आपको कॉल भी करना होगा ।

आम तौर पर, setPreferredSize()यदि लेआउट प्रबंधक मौजूद है, तो उम्मीद के मुताबिक घटकों को बाहर रखा जाएगा; अधिकांश लेआउट प्रबंधक अपने घटकों के पसंदीदा (साथ ही न्यूनतम और अधिकतम) आकार प्राप्त करके काम करते हैं, फिर लेआउट के नियमों के अनुसार उन घटकों का उपयोग करते हैं setSize()और setLocation()उन्हें स्थिति में लाते हैं।

उदाहरण के लिए, BorderLayoutइसके "उत्तर" क्षेत्र की सीमा को इसके उत्तर घटक के पसंदीदा आकार के बराबर बनाने की कोशिश करता है --- वे इससे बड़े या छोटे आकार के आधार पर JFrame, अन्य घटकों के आकार के आधार पर समाप्त हो सकते हैं। लेआउट में, और इसी तरह।


1
मैंने सोचा था कि एक घटक डिफ़ॉल्ट रूप से (BorderLayout?) द्वारा लेआउट प्रबंधक का उपयोग कर रहा था, इसलिए यदि मैं स्पष्ट रूप से एक लेआउट प्रबंधक सेट नहीं करता हूं तो इसका मतलब है कि मुझे setPreferredSize () के बजाय setSize () का उपयोग करना चाहिए?
डेविड रोबल्स

3
मेरा मानना ​​है कि JPanels डिफ़ॉल्ट रूप से BorderLayout का उपयोग करता है, लेकिन JComponent का कोई डिफ़ॉल्ट लेआउट नहीं है। यदि आप सेटसेट () का उपयोग करने के बजाय कुछ जोड़ रहे हैं, तो अधिकांश समय, आप लेआउट प्रबंधक की स्थापना करना बेहतर समझते हैं।
Sbodd

8
मेरी सिफारिश हमेशा एक लेआउट प्रबंधक का उपयोग करना है। SetSize () को कुछ ऐसा माना जाना चाहिए जो लेआउट प्रबंधक कहता है - ऐसा कुछ नहीं जिसे आप कहते हैं।
केविन डे

8
@Sbodd - JPanels में डिफ़ॉल्ट रूप से एक FlowLayout है। JFrame.getContentPane () में डिफ़ॉल्ट रूप से एक BorderLayout है।
नेमी

10

setSize()या setBounds()उपयोग किया जा सकता है जब कोई लेआउट प्रबंधक का उपयोग नहीं किया जा रहा हो।

हालाँकि, यदि आप एक लेआउट प्रबंधक का उपयोग कर रहे हैं, तो आप लेआउट प्रबंधक को संकेत प्रदान कर सकते हैं setXXXSize()जैसे setPreferredSize()और setMinimumSize()आदि।

और सुनिश्चित करें कि घटक का कंटेनर एक लेआउट प्रबंधक का उपयोग करता है जो अनुरोधित आकार का सम्मान करता है। FlowLayout, GridBagLayout, और SpringLayoutप्रबंधकों घटक की पसंदीदा आकार (उत्तरार्द्ध दो बाधाओं आप सेट पर निर्भर करता है), लेकिन का उपयोग BorderLayoutऔर GridLayoutआम तौर पर आप don't.If एक घटक पहले से ही दिखाई दे रहा है कि के लिए नए आकार संकेत निर्दिष्ट करते हैं, आप पर पुनः सत्यापित विधि को लागू करने की जरूरत है यह सुनिश्चित करने के लिए कि इसका नियंत्रण पदानुक्रम फिर से निर्धारित किया गया है। फिर दमन विधि को लागू करें।


5

setSize निर्दिष्ट आकार के घटक का आकार बदल देगा।

setPreferredSizeपसंदीदा आकार सेट करता है। घटक वास्तव में यह आकार उस कंटेनर के आकार के आधार पर नहीं हो सकता है जिसमें यह है, या यदि उपयोगकर्ता घटक को फिर से आकार देता है।


क्या आप setPreferredSize (...) का पूरा उदाहरण दिखा सकते हैं। मुझे लगता है कि यह मददगार होगा।
डग Hauf

4

IIRC ...

setSize घटक का आकार निर्धारित करता है।

setPreferredSizeपसंदीदा आकार सेट करता है। लेआउटमैन अपने घटक के लिए उस स्थान को व्यवस्थित करने का प्रयास करेगा।

यह इस बात पर निर्भर करता है कि आप लेआउट मैनेजर का उपयोग कर रहे हैं या नहीं ...


और क्या होगा अगर मैं एक लेआउट प्रबंधक को स्पष्ट रूप से निर्दिष्ट करने के लिए दो jpanels जोड़ देता हूं जो कि jframe के लिए स्पष्ट रूप से है? मुझे किस विधि का उपयोग करना चाहिए जो कि जेंपल्स का आकार निर्धारित करता है?
डेविड रॉबल्स

3
सामग्री पैन डिफ़ॉल्ट रूप से BorderLayout का उपयोग करते हैं ( java.sun.com/docs/books/tutorial/uiswing/layout/use.html )। तो JFrame के contentPane एक LayoutManager है, तो setPreferredSize चाहिए काम ..
Miku

अच्छा लगता है, इसका मतलब है कि मुझे JFrame के लिए setSize का उपयोग करना चाहिए और अंदर के घटकों के लिए निर्धारित करें
David Robles

1
आप आमतौर पर सभी बाल घटकों की गणना की गई पसंदीदा आकार का लाभ लेने के लिए फ्रेम.पैक () का उपयोग करेंगे। अन्यथा यदि आप केवल बेतरतीब ढंग से फ्रेम.सेटसाइज़ () का उपयोग करते हैं, तो सामग्री फलक में जोड़े गए घटक उपलब्ध स्थान को फिट करने के लिए / अनुबंध का विस्तार करेंगे, जिसका अर्थ है कि प्रत्येक घटक का पसंदीदा आकार ओवरराइड हो सकता है।
कैमिक्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.