我有以下内容,
GridLayout layout = new GridLayout(4, 0);
如果我有5
项,则会创建2
列,其中第一列包含3
行,第二列包含2
行。这不是我想要的,也不是我所期望的。我希望第一列包含4
行,第二列包含1
行。
为什么这个布局管理器不遵守每列我想要的行数?或者更好的是,我如何让这个布局经理尊重这个?
答案 0 :(得分:6)
结果似乎是预期的:“只有当行数设置为零时,指定列数才会影响布局。”
您可以使用JList
获得所需效果,如here所示。
private static final int N = 5;
...
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(N - 1);
答案 1 :(得分:4)
免责声明:这不作为具体答案提供,而是为了证明SSCCE的有用性......
GridLayout
构造函数是GridLayout(int rows,int cols)
(我之所以提到它是因为@AndrewThompson在他的回答中表示你可能混淆了LayoutManager
的行/列的参数。因此4,0
将为我们提供4行和可变数量的列。
当我添加4个标签时,我得到4行和1个coloumn(如预期的那样):
当你添加5个标签时,我得到3行和2个颜色,每个有2个项目,除了最后一个有1个:
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个组件。