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); } }