我有以下,
GridLayout layout = new GridLayout(4, 0);
如果我有5项目,这将创建2列,其中第一个包含3行,第二个包含2行。这不是我想要的,也不是我所期望的。我希望第一列包含4行,第二列包含1行。
为什么这个布局管理器不尊重我每列想要的行数?或者更好的是,我如何让这个布局管理器尊重这一点?
我有以下,
GridLayout layout = new GridLayout(4, 0);
如果我有5项目,这将创建2列,其中第一个包含3行,第二个包含2行。这不是我想要的,也不是我所期望的。我希望第一列包含4行,第二列包含1行。
为什么这个布局管理器不尊重我每列想要的行数?或者更好的是,我如何让这个布局管理器尊重这一点?
结果似乎是预期的:“仅当行数设置为零时,指定列数才会影响布局。”
您可以使用 获得所需的效果JList,如下所示。
private static final int N = 5;
...
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(N - 1);

免责声明:这不是作为具体答案提供的,而是为了证明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();
}
});
}
}
您指定的 GridLayout 的列数为 0。这意味着列数由布局决定。在这种情况下,它会尝试根据项目数计算所需的列数。
如果您添加了 4 个组件,您将得到 4 行,每行一个组件。如果添加 5 个组件,则需要两列,并且它们会依次填充组件,这意味着只会消耗 3 行。
因此,根据您的组件数量,您可能会看到是否使用了所有指定的行。例如尝试使用 7 个组件。