学习JAVA-布局管理的时候,在书上看到了这么一段话:GridBagLayout的功能非常强大,使用是也比较复杂,考虑到一般的读者很少会使用到这种管理,这里不做介绍。然书本就跳过了,为什么功能强大却很少会使用呢?或者因为那个“一般”?
于是我到网上查了查GridBagLayout(网格布袋布局)的用法。
感谢:链接
(0_o)
两个主要的类:
GridBagLayout();布局管理器,和其他的布局管理器用法差不多;
GridBagConstraints();约束管理器,主要用来约束放到GridBagLayout中的组件的属性,比如:位置,大小,外部填充,内部填充等等属性;
主要的约束及其值:
普通约束:int gridx,gridy;——组件插入哪个指定的网格,如左上角的网格坐标为0,0;默认为RELATIVE,即在上一个add的表格坐标上加一;如上一个是(1,1)则 设置(RELATIVE,RELATIVE)后,添加的下一个组件坐标为(2,2);
int gridwidth,gridheight;——组件横向,纵向横跨多少个网格,默认值为1,有两个值:REMAINDER(设置此约束后,下一个添加的就是此行或则和列的 最后一个,一般列不常用,经常用来换行),RELATIVE(该组件是该行或者列的倒数第二个,常用在纵向上);
伸缩约束:int fill;——指在窗口被伸缩时组件如何跟着自动伸缩;
有四个值:NONE:组件不动,不占空白区域;HORIZONTAL:组件可以水平方向上伸 缩;VERTICAL:垂直伸缩;BOTH:双向伸缩;
int weightx, weighty:组件在横向和纵向上如何按比例伸缩;
组件尺寸约束规则:int ipadx, ipady:即inner padding x and y,即组件的内部填充尺寸,比如一个按钮,就是按钮的文字和按钮边框之间的空间;
Insets insets:规定了外部填充区域的大小,实际指定了组件实施区域的边间直接的距离,比如一个空间和网格之间的空间;
anchor:组件在显示区域中的位置,总共有9个方位,分别是东南西北中、东北、西北、东南、西南,英文就不枚举了,比如南是SOUTH,东 北是NORTHEAST,其它类推;
规则:每次GridBagLayout只能根据所设置的GridBagConstraints约束
try:
1 import java.awt.*; 2 import javax.swing.*; 3 4 public class GridBagLayoutDemo { 5 private static final int EXIT_ON_CLOSE = 0; 6 private JFrame f=new JFrame("GradBagLayout test"); 7 //创建网格布局 8 private GridBagLayout gbl=new GridBagLayout(); 9 //创建月暑期 10 private GridBagConstraints gbc=new GridBagConstraints(); 11 //创建10存放按钮的空间 12 private JButton but[]=new JButton[11]; 13 14 //添加按钮方法 15 private void addButton(JButton but) { 16 //给网格包布局设定约束器 17 gbl.setConstraints(but, gbc); 18 f.add(but); 19 } 20 21 // 22 public void init() { 23 //出事还10个按钮 24 for(int i=0;i<11;i++) { 25 but[i]=new JButton("Button"+i); 26 27 } 28 29 //设定框架布局模式 30 f.setLayout(gbl); 31 //设定伸缩为两个方向的 32 gbc.fill=GridBagConstraints.BOTH; 33 //设定纵向肾伸缩比例为1:1 34 gbc.weighty=1; 35 //设置纵向的伸缩比例为1:1 36 gbc.weightx = 5; // 第一行的三个都是1:1:1 37 addButton(but[0]); 38 addButton(but[1]); 39 addButton(but[2]); 40 //这句话的意思是,添加完第三个按钮,接下来的一个位置就是第一行的最后一个,所以添加完第四个就换行了 41 gbc.gridwidth = GridBagConstraints.REMAINDER; 42 addButton(but[3]);//此行的最后一个 43 // 第2行1个按钮,仍然保持REMAINDER换行状态 44 addButton(but[4]); 45 46 // 第3行2个按钮,分别横跨2格 47 gbc.gridwidth= 2; 48 gbc.weightx = 1; 49 addButton(but[5]); 50 gbc.gridwidth = GridBagConstraints.REMAINDER;//本行最后一个单元格 51 addButton(but[6]); 52 53 //7纵跨2个格子,8、9一上一下 54 gbc.gridheight = 2; 55 gbc.gridwidth = 1; 56 gbc.weightx = 1; 57 addButton(but[7]); // 由于纵跨2格因此纵向伸缩比例不需要调整,默认为1*2格,比例刚好 58 59 gbc.gridwidth = GridBagConstraints.REMAINDER; 60 gbc.gridheight=1; 61 gbc.weightx=3; 62 addButton(but[8]); 63 addButton(but[9]); 64 65 gbc.gridx=2; 66 gbc.gridy=5; 67 gbc.ipadx=1000; 68 gbc.ipady=500; 69 //设置外部填充区域 70 Insets i=new Insets(10,10,10,10); 71 gbc.insets=i; 72 gbc.anchor=GridBagConstraints.EAST; 73 addButton(but[10]); 74 75 76 77 f.pack(); 78 f.setDefaultCloseOperation(EXIT_ON_CLOSE); 79 f.setVisible(true); 80 81 } 82 83 84 public static void main(String[] args) { 85 new GridBagLayoutDemo().init(); 86 } 87 88 }
运行效果:
学到:
1、GridBagConstraints声明的时候不要给所有参数,直接声明GridBagConstraints gbc=new GridBagConstraints();需要设置哪个约再设置;如gbc.fill=GridBagConstraints.BOTH;
2、网格包布局是网格布局的升级版,也是网格布局和流布局的结合(如果约束器都是默认的话);