我有一个非常简单的Java程序(见下文)。 GridLayout有20行4列。如您所知,元素应该通过(GridLayout)定义水平添加。但是,我将两个元素(标签)一个放在另一个上面,垂直放置。
我给它们着色并意识到标签占据整行,因此垂直效果。但后来我也使用了setSize(5,5)来使它们变小,但是它们仍占据了整行。有关为什么会发生这种情况以及如何修复/设置较小尺寸/等的任何建议?
public class Sam extends JFrame {
public JButton btn_arr;
public Container c;
public JLabel[] lbl = new JLabel[20];
public Sam()
{
c = getContentPane();
c.setLayout(new GridLayout(20,4));
lbl[1] = new JLabel("Column1");
c.add(lbl[1]);
lbl[2] = new JLabel("Column2");
c.add(lbl[2]);
show();
}
public static void main(String[] args)
{
Sam x = new Sam();
x.setVisible(true);
x.setSize(7500,4500);
}
}
答案 0 :(得分:3)
您只是将两个组件添加到网格中,以便填充它。您需要将更多组件添加到网格中作为占位符,以便它可以将原始JLabel放置在适当的位置,可能是空的JLabel或JPanel。
另外,您应该避免设置任何Swing组件的大小。您目前的尺寸为7500,4500有点大尺寸。
除此之外,也许你想在这里使用JTable。
编辑:如果你想要一个包含4列和变量行数的GridLayout,请使用0
作为GridLayout行常量:
c.setLayout(new GridLayout(0, 4));
如,
import java.awt.*;
import javax.swing.*;
public class Sam extends JFrame {
public static final int COLUMN_COUNT = 4;
public JButton btn_arr;
public Container c;
public JLabel[] lbl = new JLabel[COLUMN_COUNT];
public Sam() {
c = getContentPane();
c.setLayout(new GridLayout(0, COLUMN_COUNT));
for (int i = 0; i < lbl.length; i++) {
lbl[i] = new JLabel("Column " + (i + 1));
c.add(lbl[i]);
}
}
public static void main(String[] args) {
Sam x = new Sam();
x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x.pack();
x.setLocationRelativeTo(null);
x.setVisible(true);
// x.setSize(7500,4500);
}
}
但我仍然想知道JTable在这里是否会更好用。
答案 1 :(得分:2)
GridLayout要记住的一件事是,它被设计为覆盖整个包含面板,尽可能平均地调整单元格大小,添加到单元格中的元素将被扩展以填充整个单元格。因此,当单元格大小发生变化时,标签的大小也会发生变化。有效地,网格单元强制所有包含元素在X和Y方向上的膨胀/收缩。
如果必须使用GridLayout,防止这种情况发生的一种方法是不将标签直接添加到使用GridLayout的容器中,而是将每个标签放在使用FlowLayout(默认值)的JPanel中设置左,中或右的对齐方式,然后将该JPanel添加到网格容器中。 JPanel将调整大小,但不会更改Label的大小。
或者使用GridBagLayout管理器。更复杂,但一旦你理解它,它会让生活更轻松。但正如Hovercraft所提到的,如果您要做的是创建一个带有列标题的网格,那么JTable可能是更好的选择。