【问题标题】:Swing: column-flow layout manager?Swing:列流布局管理器?
【发布时间】:2011-06-10 20:34:33
【问题描述】:

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

【问题讨论】:

    标签: java swing layout-manager


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      但如果我没记错的话,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);
      
          }
      }
      

      【讨论】:

      • 谢谢,但是 GridBagLayout 和其他面向网格的布局具有静态网格大小。我需要动态计算网格大小。
      • 您尝试过自己的演示吗?它水平流动,而不是垂直流动。 (仅供参考,当您可以通过自己调整 JFrame 的大小以交互方式执行此操作时,调用 setSize() 没有多大意义)
      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 2016-01-31
      • 2011-09-14
      • 2010-10-02
      • 2011-06-11
      • 2010-10-07
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多