GridLayout不遵守每列我想要的行数

时间:2013-01-30 16:27:25

标签: java swing awt layout-manager grid-layout

我有以下内容,

GridLayout layout = new GridLayout(4, 0);

如果我有5项,则会创建2列,其中第一列包含3行,第二列包含2行。这不是我想要的,也不是我所期望的。我希望第一列包含4行,第二列包含1行。

为什么这个布局管理器不遵守每列我想要的行数?或者更好的是,我如何让这个布局经理尊重这个?

3 个答案:

答案 0 :(得分:6)

结果似乎是预期的:“只有当行数设置为零时,指定列数才会影响布局。”

您可以使用JList获得所需效果,如here所示。

private static final int N = 5;
...
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(N - 1);

image

答案 1 :(得分:4)

免责声明:这不作为具体答案提供,而是为了证明SSCCE的有用性......

GridLayout构造函数是GridLayout(int rows,int cols)(我之所以提到它是因为@AndrewThompson在他的回答中表示你可能混淆了LayoutManager的行/列的参数。因此4,0将为我们提供4行和可变数量的列。

当我添加4个标签时,我得到4行和1个coloumn(如预期的那样):

enter image description here

当你添加5个标签时,我得到3行和2个颜色,每个有2个项目,除了最后一个有1个:

enter image description here

IMO预计GridLayout必须遵守列/行计数> 0(任何小于0且LayoutManager计算金额),因此如果我们添加的组件多于允许的行数,则会创建新的coloumn&gt ; 0但是> 1为0和1执行相同的操作。因此,当我们用4个组件填充4x0的网格时,它会创建2个coloums,我们期望每条线上的2个组件(对于每个coloums)和剩下的最后一行(不一定是最后一行,具体取决于组件的数量,即8会将它填充到最后一行,因为它现在是4x2但是添加9个组件会导致{4}的GridLayout - 在转到新行之前填充该行的所有颜色)

请发布SSCCE重新解决问题,否则我们只是猜测这是我做的示例,其显示的行为与您所说/得到的行为不同:

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        GridLayout layout = new GridLayout(4, 0);
        frame.setLayout(layout);

        for (int i = 0; i < 5; i++) {
            frame.add(new JLabel(String.valueOf(i + 1)));
        }

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Create Swing components on EDT
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
}

答案 2 :(得分:2)

您指定的GridLayout的列数为0.这意味着列数将由布局决定。在这种情况下,它会尝试根据项目数计算所需的列数。

如果您添加了4个组件,那么您将获得4行,每行包含一个组件。如果添加5个组件,则需要两列,并且它们按顺序填充组件,这意味着只会消耗3行。

因此,根据您的组件数量,您可能会看到所有指定的行使用与否。例如,试试7个组件。