GridLayout 超出其大小
GridLayout exceeds its size
我创建了 JPanel
并将布局设置为 GridLayout
,我将其设置为 3 行和 5 列。
但是当我向该面板添加 11 个 JButton 时,它每行显示 3 行 4 列。
我希望 JButton 显示在 3 行 5 列中。
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel(new GridLayout(3, 5));
for (int i = 0; i < 11; i++) {
JButton jButton = new JButton("Click");
panel.add(jButton);
}
frame.add(panel);
frame.setLocationByPlatform(false);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
解决方案是为网格布局的其余插槽添加某种填充物。 3 行和 5 列的网格布局可以采用 3x5 = 15 个组件。由于您添加了 11 个组件,因此有 4 slots/positions 个为空。在这些位置上使用填充剂会给你想要的结果。
看我的例子:
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame();
JPanel panel = new JPanel(new GridLayout(3, 5));
for (int i = 0; i < 11; i++) {
JLabel label = new JLabel("something");
label.setBorder(BorderFactory.createLineBorder(Color.green));
panel.add(label);
}
for (int i = 0; i < 3 * 5 - panel.getComponentCount(); i++) {
panel.add(Box.createRigidArea(new Dimension()));
}
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
});
}
结果:
添加了 11 个对象。
new GridLayout(3, 5)
但是现在看将第一个参数替换为0的结果
new GridLayout(0, 5)
the constructor 的 参数 部分描述了这个技巧。
Parameters
rows
- the rows, with the value zero meaning any number of rows.
cols
- the columns, with the value zero meaning any number of columns.
GridLayout
构造函数的 4 参数版本也会发生同样的事情。
我创建了 JPanel
并将布局设置为 GridLayout
,我将其设置为 3 行和 5 列。
但是当我向该面板添加 11 个 JButton 时,它每行显示 3 行 4 列。
我希望 JButton 显示在 3 行 5 列中。
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel(new GridLayout(3, 5));
for (int i = 0; i < 11; i++) {
JButton jButton = new JButton("Click");
panel.add(jButton);
}
frame.add(panel);
frame.setLocationByPlatform(false);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
解决方案是为网格布局的其余插槽添加某种填充物。 3 行和 5 列的网格布局可以采用 3x5 = 15 个组件。由于您添加了 11 个组件,因此有 4 slots/positions 个为空。在这些位置上使用填充剂会给你想要的结果。
看我的例子:
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame();
JPanel panel = new JPanel(new GridLayout(3, 5));
for (int i = 0; i < 11; i++) {
JLabel label = new JLabel("something");
label.setBorder(BorderFactory.createLineBorder(Color.green));
panel.add(label);
}
for (int i = 0; i < 3 * 5 - panel.getComponentCount(); i++) {
panel.add(Box.createRigidArea(new Dimension()));
}
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
});
}
结果:
添加了 11 个对象。
new GridLayout(3, 5)
但是现在看将第一个参数替换为0的结果
new GridLayout(0, 5)
the constructor 的 参数 部分描述了这个技巧。
Parameters
rows
- the rows, with the value zero meaning any number of rows.
cols
- the columns, with the value zero meaning any number of columns.
GridLayout
构造函数的 4 参数版本也会发生同样的事情。