【发布时间】:2021-12-23 10:26:24
【问题描述】:
这是一个非常简单的布局(包括代码),其中不均匀的列大小可以改善填充。
有没有办法使用单个 GridBagLayout 让组件很好地组合在一起?
我认为对前两个组件使用 3 的宽度,然后对接下来的两行使用 5 和 1 的宽度会影响对齐,但我无法让它保持齐平。我目前的解决方案(不包括在内)是创建一个带有红色和绿色面板的子面板。
import javax.swing.*;
import java.awt.*;
public class GridBagWrong{
public static void main(String[] args){
JPanel content = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
//create five panels to layout.
JPanel a = new JPanel();
a.setPreferredSize( new Dimension(300, 30) );
a.setBorder( BorderFactory.createLineBorder(Color.BLUE) );
JPanel b = new JPanel();
b.setPreferredSize( new Dimension(300, 30) );
b.setBorder( BorderFactory.createLineBorder(Color.BLUE) );
JPanel c = new JPanel();
c.setPreferredSize( new Dimension(500, 30) );
c.setBorder( BorderFactory.createLineBorder(Color.GREEN) );
JPanel d = new JPanel();
d.setPreferredSize( new Dimension(500, 30) );
d.setBorder( BorderFactory.createLineBorder(Color.GREEN) );
JPanel e = new JPanel();
e.setPreferredSize( new Dimension(100, 60) );
e.setBorder( BorderFactory.createLineBorder(Color.RED) );
//place them in a gridbaglayout.
gbc.gridwidth = 3;
content.add(a, gbc);
gbc.gridx = 3;
content.add(b, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 5;
content.add(c, gbc);
gbc.gridy = 2;
content.add(d, gbc);
gbc.gridy = 1;
gbc.gridx = 5;
gbc.gridheight = 2;
gbc.gridwidth = 1;
content.add(e, gbc);
JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setContentPane( content );
frame.pack();
frame.setVisible(true);
}
}
【问题讨论】:
-
理论上,是的,基于您的示例代码,出于某种原因,当我添加
c(一次测试一个面板)时,它会为容器添加“更多”空间,它抛出了右侧的尺寸......我不知道为什么 -
1) 应该如何为各种面板容器分配额外的宽度和高度? 2) 您是否打算使用
GridBagLayout?我开始在脑海中扭转面板放置的限制,并意识到其他布局的组合可能(参见(1))更容易。 -
您不能随意使用 3 和 5 的网格宽度。只有在其中一行中有 6 个组件时才有效。然后使用 3 或 5 的网格宽度是有意义的。但是,您可以为每列配置最小宽度。然后指定网格宽度是有意义的。有关此方法的示例,请参阅:stackoverflow.com/questions/59009741/…。
-
@camickr 我错误地认为,使用更多的网格元素可以让我更好地切割布局。考虑只在顶行添加 1 个面板,添加网格宽度 2,在底行网格上添加 2 个面板,每个面板添加 1 个。然后布局就可以打包好了,即使第二行有不同大小的面板。
-
“gridwidth”约束基本上是说“忽略组件的首选宽度,并将宽度基于在其他行中找到的组件”。列的宽度基于在该列中添加的最大组件的宽度
gridwidth = 1。第二行有两个组件,因此可以计算出每列的首选宽度。然后可以计算出第一行组件的宽度。使用gridwidth = 1添加更多组件会有所帮助。这实际上就是我的回答所做的。它在不使用实际组件的情况下创建更多列。
标签: java swing layout-manager gridbaglayout