[疯狂Java笔记]AWT:布局管理器、绝对布局、FlowLayout流式布局

1. 对容器中的组件进行合理的布局——布局管理器:

    1) 当然用户可以自己手动测量定位来设置组件在容器中的绝对位置和绝对大小,但这很麻烦,并且牺牲了平台无关性;

    2) 单通常在数学上,只要组件在容器中按照一定规律排列的话就必然有一个最佳位置和最佳大小,这个最佳可以理解为既没有冗余的空间也没有任何关键内容被遮挡;

    3) 上述中可以看到布局的两个要素就是:

         i. 组件在容器中的排列规则;

         ii. 组件的最佳位置和最佳大小;

    4) 布局管理器就是用来解决这两个问题的,只要给定容器的边界,并指定组件的排列规则,接着只要无脑地往容器中塞组件就可以自动计算出组件的最佳位置和最佳大小,并以这个结果显示出来;

    5) 布局管理器LayoutManager类是一个基类,而其各个子类就定义了组件的排列规则,总共有6种子类,分别是FlowLayout(流式排列布局)、BorderLayout(方位排列布局)、GridLayout(网格排列布局)、GridBagLayout(网格袋布局)、CardLayout(卡堆布局)、BoxLayout(盒式布局)这6中,其中前5种是AWT中的传统布局,而BoxLayout(盒式布局)是Swing中提出来的,当然也可以在AWT中使用;

!!其不同的子类就定义了组件的排列规则;

    6) 如何决定容器的布局:

         i. 只要调用容器的方法setLayout即可;

         ii. 原型:void Container.setLayout(LayoutManager mgr); // 传入具体的布局管理器(子类)

         iii. 例如:c.setLayout(new FlowLayout()); // 即参数一般通过new创建一个具体的布局管理器

!!如果不手工设定容器的布局方式,那么每种容器都有自己的默认布局方式:

        a. Window系(Frame、Dialog)默认BorderLayout(方位布局);

        b. Panel系(Panel、Applet)默认FlowLayout(流式布局);

        c. ScrollPane默认BorderLayout(方位布局),ScrollPane比较特殊,不允许改变其默认布局方式,因此就认定方位布局了;


2. 绝对布局:

    1) 当然可以不借助布局管理器由用户直接精确定义组件的位置以及大小;

    2) 直接使用Component的方法setSize、setLocation、setBounds即可;

    3) 但是绝对布局不仅费神,需要提前精确计算,而其会丧失跨平台特性,在Java图形界面编程中绝对不推荐绝对定位的方式;

    4) 如果一定要使用绝对布局,那么就先调用容器的setLayout,传递null参数,就表示启用绝对定位,然后就调用组件的set三方法定位后add进容器即可:c.setLayout(null);


3. FlowLayout——流式布局:

    1) 即组件像流水一样排列,遇到障碍就折回重头排过,Panel系默认此类型布局;

    2) 默认状态下组件从左到右,遇到右边界后再另起一行从左到右排列,当然这种排列顺序是可以设置的;

    3) 构造器:

         i. 默认构造器:FlowLayout(); // 默认从左到右排列

         ii. 指定排列方向:FlowLayout(int align);

align是FlowLayout定义的静态常量,分别为LEFT(从左到右排列)、RIGHT(从右到左排列)、CENTER(中间向两边扩展排列),第三种很少用,比较奇葩,尽量别用吧!

         iii. 指定排列方向同时指定组件间隔:FlowLayout(int align, int hgap, int vgap); // hgap是组件之间的水平间距,vgap是垂直间距,单位都是逻辑单位长度

    4) 示例:

public class AwtTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Frame f = new Frame("FlowLayout Test");
		f.setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 5));
		
		for (int i = 0; i < 10; i++) {
			f.add(new Button("Button" + i));
		}
		
		f.pack(); // 设置窗口的最佳大小
		f.setVisible(true);
	}

}
!!一般不提倡用从左到右方向之外的其它方向,没什么必要!

!关于pack方法:

    a. 该方法始于Window类,是专门用于框架窗口的;

    b. 原型:void Window.pack();

    c. 该方法的目的就是自动调整窗口的大小,使之最佳适应里面的组件的布局方式和组件的大小;

    d. 虽然有布局管理器可以使组件的排列达到最佳,但是布局管理器只管组件之间的排列并不管组件和容器边界的间隔,也许容器特别大,它和中间排列有序的组件之间有很多空白的地方,例如下面,中间的组件紧凑有序,但和外围的框架之间存在较大的空白


!!因此需要使用pack将框架也最佳适应其中的组件,就是不留多余空白,也不遮蔽关键内容;

相关文章
相关标签/搜索