java - 了解 GridBagLayout 约束

标签 java swing layout-manager gridbaglayout

我对 Swing 还比较陌生,我正在尝试弄清楚它到底是如何工作的。如果我错了请告诉我。

我基本上已经弄清楚了放置组件所必需的 gridx 和 gridy 。您至少需要 n 个 (gridx,gridy) 值才能创建 nxn 网格。例如 (5,5),(3,3),(4,9),(3,10) 将使用上面的 (gridx,gridy) 分别放置的组件创建一个 3x4 网格空间(4 行,3 列)在单元格 (3,2),(1,2),(2,3),(1,4) 中。

weightx和weighty似乎有2个函数,weightx和weighty的>0值将网格单元拉伸(stretch)到边缘(否则它是集中的),我们还可以设置组件大小的比例 - 所以如果一个组件有gridx =0.1,而另一个是 0.2,那么后一个可能是两倍宽。但是,在调整组件比例时,会考虑组件的最小默认宽度和高度。

需要填充才能将组件拉伸(stretch)到单元格的边缘。如果没有填充,组件将保留在中心。

但在这种情况下我们可以使用 anchor 将组件定位在单元格的西北角而不是中心。

插图在单元边缘内创建一堵空间墙。

ipadx 和 ipady 插入包含单元格的列或行的边界。

但是我无法很好地弄清楚 gridwidth 和 gridheight 是如何工作的。

考虑下面这个示例。这里有 4 个按钮放置在单元格 b1(3,2)、b2(1,1)、b3(2,3)、b4(4,4) 中 4x4 网格空间。

如何使按钮(例如 b2 或 b4)占据其所在单元格的整行或整列?

import javax.swing.*;
import java.awt.*;
//import java.awt.event.*;
public class Swing29a
{
public static void main(String[] args)
{
JFrame f1= new JFrame("GridBag Layout Test");

f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.setResizable(true);
f1.setLocation(200,100);
f1.setSize(800,800);

JPanel p1 = new JPanel();
p1.setBackground(Color.black);
f1.add(p1);


JButton b1= new JButton("Button 1");
b1.setBackground(Color.white);

JButton b2= new JButton("Button 2");
b2.setBackground(Color.white);

JButton b3= new JButton("Button 3");
b3.setBackground(Color.white);

JButton b4= new JButton("Button 4");
b4.setBackground(Color.white);



GridBagLayout gm1= new GridBagLayout();
p1.setLayout(gm1);
GridBagConstraints cns =new GridBagConstraints();

cns.gridx=5;
cns.gridy=5;
cns.weightx=0.1;
cns.weighty=0.1;
cns.fill=GridBagConstraints.BOTH;

p1.add(b1,cns);

cns.gridx=3;
cns.gridy=3;
p1.add(b2,cns);


cns.gridx=4;
cns.gridy=9;
p1.add(b3,cns);

cns.gridx=7;//3;
cns.gridy=10;
cns.gridheight=3;
cns.weightx=0.2;
cns.weighty=0.2;
//cns.weightx=10.0;
//cns.weighty=9.0;    
//cns.ipadx=50;
//cns.ipady=50;
p1.add(b4,cns);

f1.setVisible(true);

}
}

编辑: 这是图像链接 http://postimg.org/image/wae2x4w4z/

我希望任何按钮都能够填充整行或整列,或者至少占据一行中的 2 个单元格。

最佳答案

网格宽度、网格高度:

单元格为单位指定列数(对于网格宽度)或行数(对于网格高度),组件的显示区域可以被定义了这些约束的组件所占用。默认值为1

所以,如果对于 (R x C) 网格;一行中有 C 个单元格。如果您希望组件占据该特定行的所有单元格,只需将 GridBigConstraint.gridWidth 设置为 C 即可。

使用GridBagConstraints.REMAINDER指定该组件是其行(对于网格宽度)或列(对于网格高度)中的最后一个。

教程中已经有一个很好的书面示例:How to use GridBagLayout

关于java - 了解 GridBagLayout 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238352/

相关文章:

java - 为什么数组允许使用克隆方法?

java - 扩展 JLabel 的 Draw 类

java - 使用 cellEditor() 删除带有 jButton 的 jTable 行;

java - 在 Swing 中创建等距菜单

java - 您将 JPopupMenu 的逻辑存储在哪里?

java - 如何在更改字体大小时更改 JLabel 的大小?

java - 使用集合进行类型删除

java - 是否有(在 jpos 中)任何转换器可以将 ISO 消息从一个版本转换为另一个版本?

java - 对固定大小的组件使用覆盖 getPreferredSize() 而不是使用 setPreferredSize()

java - 防止覆盖布局移动背景图像标签