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 我可以使用或子类来做这样的事情?


编辑:这与关于垂直布局的其他问题非常接近,但是该布局的组件高度是约束,而我的组件宽度是约束。

4

2 回答 2

2

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

于 2011-06-11T01:29:52.507 回答
1

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

使用 gridbag 布局知道大小,您可以设置特定行中的组件数。

但如果我没记错,gridlayout 不应该完全按照你的意愿去做。

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

    }
}
于 2011-06-10T20:37:44.757 回答