我对Swing中的GridBaGLayout有一个非常基本的疑问。我首先尝试将给定的帧划分为三个部分,权重为( 0.2,0.2和0.6)。下面的代码运行良好,因为我看到三个部分具有各自的权重。
JFrame frame = new JFrame();
frame.setLayout(new GridBagLayout());
JPanel p1= new JPanel(), p2 = new JPanel(), p3 = new JPanel();
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 0.2;
c.gridx = 0;
c.gridy = 0;
frame.add(p1,c);
p1.setBackground(Color.lightGray);
c.gridy = 1;
frame.add(p2,c);
p2.setBackground(Color.gray);
c.weighty = 0.6;
c.gridy = 2;
frame.add(p3,c);
p3.setBackground(Color.blue);接下来,我尝试在面板p1中添加一个JLabel。像这样:p1.add(new JLabel("Hi"))。如果我观察在添加之前和之后打开的帧,我会看到在两种情况下分配的权重的差异。首先(不添加JLabel时),分配0.2、0.2和0.6。其次,当添加JLabel时,第一个面板增加一个比特,第二个面板减少一个比特。你也可以在下面的图片中看到:

这是什么原因呢?因为我认为这与布局有关,根据父框架或面板中的可用空间分配权重。但是不能很好地理解其中的原因。
权重x/y划分基于可用空间。那么panel p1和p2是如何获得几乎相同的高度呢?假设框架的高度是h。当添加p1时,可用的高度是h,然后p1得到0.2*h,剩下的可用高度是0.8h。现在,当必须添加p2时,将给予0.8h的0.2,即0.16h。那么p1和p2 (浅灰色和深灰色背景色)是如何看起来高度相同的呢?
另外,我如何实现恒定划分,并保持面板的权重与分配的相同?
发布于 2017-09-08 02:39:39
我首先尝试将给定的帧划分为三个部分,其中权重为(
,0.2和0.6)。
"weightx/y“约束是针对”额外“空间的。
每个组件都按其首选大小分配空间。然后,如果帧大小增加,将以指定的比率为每个组件提供额外的空间。因此,除非每个组件的首选大小也在指定的比率中,否则组件将不会具有总体所需的比率。
空JPanel的高度为10 (基于FlowLayout的默认大小计算)。因此,所有3个面板的首选高度都是30。
如果你有一个大小为130的内容窗格,那么你就有100个像素的额外空间,所以面板的大小变成:
p1 = 10 + (100 * .2) = 30
p2 = 10 + (100 * .2) = 30
p3 = 10 + (100 * .6) = 70当您将标签添加到p1时,首选高度将变为10加上标签的高度,假设(10 + 15) = 25。因此,现在3个面板的首选高度是(25 + 10 + 10) = 45。所以只有85个像素要按您指定的比例进行分割。
我怎样才能实现恒定的除法,并保持面板的权重与分配的相同?
你可以查看Relative Layout。它旨在允许您指定每个组件的相对大小。
https://stackoverflow.com/questions/46103008
复制相似问题