我有以下,
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 个组件会导致GridLayout
4x3 - 在进入新行之前填充该行的所有列)
请发布一个重新解决问题的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 个组件。