2012-06-03 12 views
8

अधिकांश लेआउट प्रबंधकों के पास कोई तर्क नहीं है (यानी, आप new FlowLayout() के साथ फ़्लोलाउट बना सकते हैं, new GridLayout() के साथ एक ग्रिडलाउट, new GridBagLayout() आदि के साथ एक ग्रिडबैगआउट)। हालांकि, BoxLayout की आवश्यकता है कि आप दोनों कंटेनर को पास करें कि यह प्रबंधन करेगा और धुरी जिसके साथ घटकों को रखा जाना चाहिए।आपको BoxLayout के साथ setLayout का आह्वान करने की आवश्यकता क्यों है?

मेरे सवाल यह है: के बाद से आप पहले से ही लेआउट प्रबंधक जो घटक बाहर बिछाने के लिए कह रहे हैं, तुम क्यों

BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS); 
myPanel.setLayout(bl); 

सिर्फ पहली पंक्ति के बजाय लिखने के लिए की जरूरत है?

मैंने the BoxLayout source code पर एक त्वरित नज़र डाली और देखा कि मैं जिस कंस्ट्रक्टर का उपयोग करता हूं (लाइन 178-185) target.setLayout(this) या इस तरह के किसी भी चीज़ पर कॉल नहीं करता है। ऐसा लगता है कि इसे जोड़ने के लिए वास्तव में आसान होगा। क्या ऐसा कोई कारण है कि इसे स्विंग लाइब्रेरी में शामिल नहीं किया गया है?

अगर यह मायने रखती है, मैं

जावा संस्करण 1.7.0

जावा (टीएम) एसई रनटाइम वातावरण का उपयोग कर रहा (निर्माण 1.7.0-b147)

Win7Pro पर ।

धन्यवाद!


SSCCE:

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 

public class BoxLayoutSSCCE extends JFrame { 

    // Change this to see what I mean 
    public static final boolean CALL_SET_LAYOUT = true; 

    public BoxLayoutSSCCE() { 
     super("Box Layout SSCCE"); 
     JPanel panel = new JPanel(); 
     BoxLayout bl = new BoxLayout(panel, BoxLayout.Y_AXIS); 
     if (CALL_SET_LAYOUT) { 
      panel.setLayout(bl); 
     } 
     panel.add(new JButton("Button 1")); 
     panel.add(new JButton("Button 2")); 
    } 

    public static void main (String[] args) { 
     BoxLayoutSSCCE blsscce = new BoxLayoutSSCCE(); 
     blsscce.pack(); 
     blsscce.setVisible(true); 
    } 
} 
+1

[sscce] (http://sscce.org/) – trashgod

उत्तर

5

ContainerBoxLayout पर पारित होने से पहले मौजूद होना चाहिए। आम तौर पर एक कुछ इस तरह लिखते हैं:

JPanel myPanel = new JPanel(); 
BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS); 
myPanel.setLayout(bl); 

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

सुविधाजनक, javax.swing.Box "एक हल्का कंटेनर प्रदान करता है जो BoxLayout ऑब्जेक्ट का उपयोग अपने लेआउट मैनेजर के रूप में करता है।"

public class Box extends JComponent implements ... { 

    public Box(int axis) { 
     super(); 
     super.setLayout(new BoxLayout(this, axis)); 
    } 
} 

अब एक पंक्ति करना होगा:।

Box myBox = new Box(BoxLayout.Y_AXIS); 
+0

एक संबंधित उदाहरण है [यहां] (http://stackoverflow.com/a/6076340/230513)। – trashgod

+1

यह समझ में आता है, और बॉक्स के बारे में मुझे बताने के लिए धन्यवाद। – wchargin

+0

आपका स्वागत है; संदर्भ के लिए, डिजाइन [सिद्धांत] [http://stackoverflow.com/a/3404369/230513) पर चर्चा के सिद्धांत के अनुरूप है। – trashgod

4

BoxLayout सुनिश्चित करें कि लेआउट तरीकों सही कंटेनर पर लागू होते हैं बनाता है। यह लागू करता है कि एक ही कंटेनर कि निर्माता में निर्दिष्ट किया गया था, विभिन्न तरीकों में प्रयोग किया जाता है इस तरह के layoutContainer(Container target), preferredLayoutSize(Container target), आदि के रूप यह checkContainer() विधि है कि सत्यापन करता करने पर निर्भर करता:

void checkContainer(Container target) { 
    if (this.target != target) { 
     throw new AWTError("BoxLayout can't be shared"); 
    } 
} 

BoxLayout कार्यान्वयन शायद कुछ कैश कंटेनर के बारे में विवरण और राज्य को बनाए रखने की कोशिश करता है, इसलिए इसे साझा नहीं किया जा सकता है।

संपादित करें:

BoxLayout लागू करता LayoutManager2.invalidateLayout() जहां यह अपने कैश्ड विवरण रीसेट करता है। अन्य लेआउट कार्यान्वयन एक ही पैटर्न का पालन करें। उदाहरण के लिए, GroupLayout और OverlayLayout को उनके रचनाकारों में कंटेनर तर्क की भी आवश्यकता होती है।

+0

मैं समझता हूँ कि यह साझा नहीं किया जा सकता है के लिए +1 हालांकि। , क्योंकि इसे साझा नहीं किया जा सकता है, यह तार्किक लगता है कि घटक को इसे अपने लेआउट के रूप में सेट करना होगा - * क्यों * बॉक्सलेआउट नहीं है 'कन्स्ट्रक्टर में' सेटलेआउट (कंटेनर) 'को कॉल करें? इसके अलावा, क्यों अन्य प्रबंधकों को यह लागू नहीं करते हैं? – wchargin

+0

@WChargin कन्स्ट्रक्टर में निर्दिष्ट तर्क बॉक्सलेआउट द्वारा प्रतिबंध को सत्यापित करने और लागू करने के लिए उपयोग किया जाता है। इसके अलावा, अन्य प्रबंधकों के बारे में मेरा संपादन देखें। – tenorsax

+0

JComponents setLa लागू करता है आप दिलचस्प हो सकते हैं ... – mKorbel

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