GridbagLayout 似乎忽略了组件大小
GridbagLayout seems to be ignoring component sizes
我是第一次使用 GridBagLayout
。我有一个 JFrame
,里面有 2 个面板。
- 框架宽1200,高800。
- 最左边
JPanel
宽800,高800
- 最右侧面板的宽度为 400,高度为 800。
当它们使用 GridBagLayout
渲染时,它们都以相同的大小显示。
这是代码:
public class DisplayFrame extends JFrame {
public DisplayFrame() {
//simple inheritance.
super(title);
setSize(new Dimension(1200, 800));
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
addComponents();
}
public void addComponents(){
this.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
add(new DisplayCanvas(), gbc);
gbc.gridx++;
add(new ControlContainer(), gbc);
}
}
public class DisplayCanvas extends JPanel{
public DisplayCanvas() {
setPreferredSize(new Dimension(800,800));
this.setBackground(Color.WHITE);
this.setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 800);
}
}
public class ControlContainer extends JPanel{
public ControlContainer() {
setPreferredSize(new Dimension(200,200));
setBackground(Color.GRAY);
setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 800);
}
}
毫无疑问,我遗漏了一些非常明显的东西。
gbc.weightx = 1;
和 gbc.weighty = 1;
覆盖了您的组件提供的大小调整提示。这基本上为两个组件提供了相同的权重,以填充 GridBagLayout
可用的剩余 space
不要只依赖尺寸提示,因为 window 可以调整尺寸。
此外,请记住,框架有装饰,因此框架不会(也不应该)为 1200x800。允许内容提供关于它需要什么的信息,并使用 pack
来确保可视区域满足您的需要,并在其周围填充框架装饰。这将使您 windows 大小,最终大于内容区域,但内容区域才是最重要的
我是第一次使用 GridBagLayout
。我有一个 JFrame
,里面有 2 个面板。
- 框架宽1200,高800。
- 最左边
JPanel
宽800,高800 - 最右侧面板的宽度为 400,高度为 800。
当它们使用 GridBagLayout
渲染时,它们都以相同的大小显示。
这是代码:
public class DisplayFrame extends JFrame {
public DisplayFrame() {
//simple inheritance.
super(title);
setSize(new Dimension(1200, 800));
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
addComponents();
}
public void addComponents(){
this.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
add(new DisplayCanvas(), gbc);
gbc.gridx++;
add(new ControlContainer(), gbc);
}
}
public class DisplayCanvas extends JPanel{
public DisplayCanvas() {
setPreferredSize(new Dimension(800,800));
this.setBackground(Color.WHITE);
this.setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 800);
}
}
public class ControlContainer extends JPanel{
public ControlContainer() {
setPreferredSize(new Dimension(200,200));
setBackground(Color.GRAY);
setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 800);
}
}
毫无疑问,我遗漏了一些非常明显的东西。
gbc.weightx = 1;
和 gbc.weighty = 1;
覆盖了您的组件提供的大小调整提示。这基本上为两个组件提供了相同的权重,以填充 GridBagLayout
不要只依赖尺寸提示,因为 window 可以调整尺寸。
此外,请记住,框架有装饰,因此框架不会(也不应该)为 1200x800。允许内容提供关于它需要什么的信息,并使用 pack
来确保可视区域满足您的需要,并在其周围填充框架装饰。这将使您 windows 大小,最终大于内容区域,但内容区域才是最重要的