Swing:列流布局管理器?

我正在寻找一个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或子类来执行此类操作?


编辑:这非常接近关于垂直布局的另一个问题 ,但是该布局将组件高度作为约束,并且我的组件宽度是约束。

承认这种布局的另一个组件是JList ,其中包括VERTICAL_WRAP “指示报纸样式布局,其中单元格垂直然后水平流动”。 根据您的需要, 这里提到的合适的ListCellRenderer可能就足够了。

你可能想看看GribBagLayout http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

通过知道尺寸的网格布局,您可以设置特定行中的组件数量。

但如果我没有弄错,网格布局应该完全按照你的意愿行事。

让我们一起使用简单的标签。 如果标签的尺寸* 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); } }