有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Swing:columnflow布局管理器?

我正在寻找一个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,但该布局以组件高度为约束,而我的布局以组件宽度为约束


共 (2) 个答案

  1. # 1 楼答案

    你可能想调查一下格里布·莱奥特 http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

    通过gridbag布局,您可以设置特定行中的组件数量

    但如果我没弄错的话,我不应该做你想做的事

    让我们来看看简单的标签。 如果标签的大小*2大于宽度,则每行仅显示一个标签。等等

    下面是一个例子,应该可以澄清这一点

    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);
    
        }
    }
    
  2. # 2 楼答案

    允许这种布局的另一个组件是^{},其中包括一个VERTICAL_WRAP,它“表示一种报纸样式的布局,单元格先垂直然后水平流动。”根据你的需要,一个合适的ListCellRenderer,上面提到的here,可能就足够了