4

我有以下,

GridLayout layout = new GridLayout(4, 0);

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

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

4

3 回答 3

6

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

您可以使用 获得所需的效果JList,如下所示

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

图片

于 2013-01-30T16:58:50.897 回答
4

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

GridLayout构造函数是GridLayout(int rows,int cols)(我提到它的原因就像@AndrewThompson 在他的回答中所说的那样,您可能已经混淆了 rows/cols 的参数LayoutManager)。因此4,0将给我们 4 行和可变数量的列。

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

在此处输入图像描述

当您添加 5 个标签时,我得到 3 行和 2 个列,每个列有 2 个项目,但最后一个有 1 个:

在此处输入图像描述

IMO 预计这GridLayout必须遵守列/行数 >0(任何小于 0 并且 LayoutManager 计算数量),因此如果我们添加的组件数超过允许的行数,它会创建一个新的列 >0 但也 >1 作为 0 和 1执行相同的操作。因此,当我们用 5 个组件填充 4x0 的 Grid 时,它现在创建 2 个列,我们期望每行(每个列)上都有 2 个组件,而最后一行(不一定是最后一行,取决于组件的数量,即8 会将其填充到最后一行,因为现在它的 4x2 但添加 9 个组件会导致GridLayout4x3 - 在进入新行之前填充该行的所有列)

请发布一个重新解决问题的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();
            }
        });
    }
}
于 2013-01-30T16:53:11.640 回答
2

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

如果您添加了 4 个组件,您将得到 4 行,每行一个组件。如果添加 5 个组件,则需要两列,并且它们会依次填充组件,这意味着只会消耗 3 行。

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

于 2013-01-30T16:58:05.363 回答