我正在寻找一个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,但是该布局的组件高度是约束,而我的组件宽度是约束。
答案 0 :(得分:2)
承认此类布局的另一个组件是JList
,其中包含VERTICAL_WRAP
“表示报纸样式布局,其中单元格垂直然后水平流动。”根据您的需要,合适的ListCellRenderer
,提及here可能就足够了。
答案 1 :(得分:1)
你可能想看看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);
}
}