我使用GridBagLayout
来(当前)显示两行。我知道这个布局对于这个任务来说太过分了,但我正在努力学习如何使用它。问题是我已将两个面板添加到两个单独的行中,并且内容周围存在巨大差距(请参阅下面的图像和代码):
alt text http://www.imagechicken.com/uploads/1264533379009864500.png
Image background;
public Table(){
super();
ImageIcon ii = new ImageIcon(this.getClass().getResource("pokerTableV2.png"));
background = ii.getImage();
setSize(Constants.FRAME_WIDTH, Constants.TABLE_HEIGHT);
setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
JButton button = new JButton("hello world");
JPanel panel1 = new JPanel();
panel1.setPreferredSize(new Dimension(800,100));
panel1.add(button, BorderLayout.CENTER);
panel1.setBackground(Color.yellow);
add(panel1, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
JPanel middlePanel = new JPanel();
middlePanel.setPreferredSize(new Dimension(800,350));
middlePanel.add(button, BorderLayout.CENTER);
middlePanel.setBackground(Color.blue);
add(middlePanel, constraints);
}
答案 0 :(得分:7)
使用
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1d;
constraints.weighty = 1d;
weightx
/ weighty
的JavaDoc说:
指定如何分配额外的水平/垂直空间。
fill
的
当组件的显示区域较大时使用此字段 比组件的请求大小。它决定了是否 调整组件大小,如果是,如何。
答案 1 :(得分:4)
不幸的是,对于GridBagLayout
,如果内容没有填充它所在的整个容器,它将自动将其所有内容集中在其容器中。这就是为什么你会有一个很大的差距。
基本上有两种解决方法:
GridBagConstraints
。在试图避免集中行为时,我的成功有限。GridBagLayout
放在FlowLayout
内,然后将FlowLayout
的左对齐设置为左上角,或任何您想要的对齐方式。我上周的某个时候曾问过并回答this question。
因此,在您的情况下,您将panel1
和middlePanel
直接添加到JFrame(?),并GridBagLayout
JFrame (GridBagLayout)
- panel1
- middlePanel
我建议使用这种替代结构,以消除所有额外空间(如果你愿意,也可以去掉中心对齐)。
JFrame (FlowLayout)
- JPanel (GridBagLayout)
- panel1
- middlePanel
HTH