2011-06-10 11 views
5

मैं LayoutManager की तलाश में हूं जो मुझे कॉलम में कंटेनर (उदा। जेपीनल) में घटकों का एक सेट दिखाने की अनुमति देगा, लगभग मोटे तौर पर।स्विंग: कॉलम-प्रवाह लेआउट प्रबंधक?

  • कंटेनर की चौड़ाई एक इनपुट बाधा है।
  • कंटेनर के पसंदीदा ऊंचाई चौड़ाई के एक समारोह है, और या तो:
    • न्यूनतम ऊंचाई चौड़ाई, जब एक से अधिक स्तंभ में बाहर रखी भीतर फिट करने के लिए घटकों की जरूरत है।
    • घटकों को एक कॉलम में फिट करने के लिए आवश्यक न्यूनतम ऊंचाई।
  • घटक अख़बार-कॉलम ऑर्डर में, ऊपर से नीचे तक और फिर बाएं से दाएं तक रखा जाएगा।

यहां एक उदाहरण (लो-टेक टेक्स्ट डिस्प्ले) 13 घटक दिखा रहा है। वे 3 कॉलम में फिट कर सकते हैं, वे इस तरह दिखेगा:

Foo1 Foo6  Foo11 
Foo2 Foo7  Foo12 
Foo3 Foo8  Foo13 
Foo4 Foo9  
Foo5 Foo10 

अगर वह भी चौड़ा है, वे इस तरह दिखना चाहते हैं:

Foo1 Foo8 
Foo2 Foo9 
Foo3 Foo10 
Foo4 Foo11 
Foo5 Foo12 
Foo6 Foo13 
Foo7  

और यदि बहुत चौड़ा है, वे देखने के लिए चाहते हैं इस तरह:

Foo1  
Foo2  
Foo3  
Foo4  
Foo5  
Foo6  
Foo7  
Foo8 
Foo9 
Foo10 
Foo11 
Foo12 
Foo13 

वहाँ एक पूर्व मौजूदा LayoutManager है कि मैं का उपयोग करें या उपवर्ग कर सकते हैं इस तरह कुछ करने के लिए है?


संपादित करें: यह बहुत ही this other question about vertical layout के करीब है, लेकिन यह है कि लेआउट घटक ऊंचाई बाधा जा रहा है, और मेरा घटक चौड़ाई एक बाधा जा रहा है।

उत्तर

1

आप GribBagLayout http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

गौर करने gridbag लेआउट आकार आप निर्धारित कर सकते हैं कि कितने घटक आप एक विशेष पंक्ति में होता है जानने के साथ कर सकते हैं।

लेकिन अगर मुझे गलती नहीं है तो ग्रिडलेआउट को वही करना चाहिए जो आप चाहते हैं।

सरल लेबल के साथ जाने देता है। यदि लेबल का आकार * 2 चौड़ाई से लंबा है, तो यह प्रति पंक्ति केवल 1 लेबल दिखाएगा। और इसी तरह।

यहाँ एक उदाहरण है जो यह स्पष्ट करना चाहिए

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class GridLayoutDemo implements ActionListener{ 
    JTextField j1; 
    JTextField j2; 
    JFrame f; 
    public void show(){ 
     j1=new JTextField("x dimention"); 
     j2=new JTextField("y dimention"); 
     f=new JFrame(); 
     JPanel p=new JPanel(); 
     JLabel l2=new JLabel("abcdefghijklmnoqrstuvw"); 
     JLabel l1=new JLabel("abcdefghijklmnoqrstuvw"); 
     JLabel l3=new JLabel("abcdefghijklmnoqrstuvw"); 
     JLabel l4=new JLabel("abcdefghijklmnoqrstuvw"); 
     JButton b=new JButton("new size"); 
     b.addActionListener(this); 

     p.add(l1); 
     p.add(l2); 
     p.add(l3); 
     p.add(l4); 
     p.add(j1); 
     p.add(j2); 
     p.add(b); 
     f.setSize(400, 200); 
     f.add(p); 

     //f.pack(); 
     f.setVisible(true); 

    } 

    public static void main(String[] args){ 
     GridLayoutDemo g=new GridLayoutDemo(); 
     g.show(); 
    } 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 
     int x=Integer.parseInt(j1.getText()); 
     int y=Integer.parseInt(j2.getText()); 
     f.setSize(x,y); 
     f.setVisible(true); 

    } 
} 
+1

धन्यवाद, लेकिन ग्रिडबैगलाउट और अन्य ग्रिड उन्मुख लेआउट में स्थिर ग्रिड आकार होता है। मुझे गतिशील रूप से ग्रिड आकार को समझने की आवश्यकता है। –

+0

क्या आपने अपना खुद का डेमो आजमाया था? यह क्षैतिज रूप से बहती है, लंबवत नहीं।(एफवाईआई को setSize() को कॉल करने में बहुत कुछ नहीं है जब आप स्वयं JFrame को आकार देकर इंटरैक्टिव रूप से ऐसा कर सकते हैं) –

2

एक अन्य घटक है कि मानते हैं लेआउट इस तरह का JList है, जो एक VERTICAL_WRAP शामिल "कोशिकाओं तो खड़ी बहने के साथ एक अखबार शैली लेआउट इंगित करता है कि क्षैतिज। " आपकी आवश्यकताओं के आधार पर, उपयुक्त ListCellRenderer, here का उल्लेख किया गया है, पर्याप्त हो सकता है।