2011-06-10 91 views
5

我正在尋找一個LayoutManager,這將允許我在一個容器(例如JPanel)中顯示一組組件,大致如下。擺動:列流佈局管理器?

  • 容器的寬度是一個輸入約束。
  • 容器的優選的高度是寬度的函數,並且可以是:
    • 得到的組件,以適應寬度,當在一個以上的列布置內所需的最小高度。
    • 使組件適合單列所需的最小高度。
  • 這些組件將按照報紙欄的順序從頂部到底部,然後從左到右放置。

下面是一個示例(低科技文本顯示),顯示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

隨着網格包佈局知道你可以設置你需要多少組件在特定行的大小。

但如果我沒有錯誤shouldnt gridlayout做正是你想要的。

讓我們走簡單的標籤。 如果標籤的尺寸* 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

謝謝,但GridBagLayout和其他面向網格的佈局具有靜態網格大小。我需要動態地計算網格大小。 – 2011-06-10 20:41:59

+0

你嘗試過自己的演示嗎?它水平流動,而不是垂直流動。(僅供參考,如果您可以通過自己調整JFrame的大小來交互式地調用setSize(),那麼沒有太多意義) – 2011-06-10 21:40:37

2

另外一個組件,它承認這種佈局是JList,其中包括一個VERTICAL_WRAP說「表示報紙樣式佈局與細胞流動垂直然後水平「。根據您的需要,合適的ListCellRenderer,提到here,可能就足夠了。