1. Java 使用AWT和Swing类完成图形用户界面编程。其中AWT的全称是抽象窗口工具集(Abstract Window Toolkit)。它是最早提供的GUI库,这个GUI库提供了一些基本的功能,但是很有局限性,所以后来又提供了Swing库。
2. 所有和AWT编程相关的类都放在java.awt包以及它的子包中,AWT编程中有两个基类:Component和MuneComponent。Component代表一个能以图形化方式显示出来,并可与用户交互的对象。例如Button代表一个按钮。而MenuComponent顾名思义代表图形界面的菜单组件,包括MenuBar
(菜单条)、MenuItem(菜单项)等子类。
3. 在AWT图形用户界面编程里还有两个重要的概念:Container和LayoutManager,其中Container是一种特殊的Compotent,它代表一种容器,可以盛装普通的Compotent,而LayoutManager则是容器管理其它组件布局的方式。
4. 容器是Component的子类,因此容器对象本身也是一个组件,具有组件的所有性质,可以调用Component类的所有方法。Component类提供了如下几个常用方法来设置组建的大小、位置和可见性等。
(1)setLocation(int x,int y):设置组建的位置;
(2)setSize(int width,int height ):设置组件的大小;
(3)setBounds(int x,int y,int width,int height):同时设置组件的位置、大小;
(4)setVisible(Boolean b):设置该组件的可见性;
5. AWT主要提供了如下两种主要的容器类型:
(1)Window:可独立存在的顶级窗口;
(2)Panel:可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中(如Window、Panel或者Applet等);
6. AWT容器的继承关系图如下所示:
常用的组件是Panel、ScrollPane、Frame和Dialog。
Frame的特点是:
1)Frame对象有标题,允许通过拖拉来改变窗口的位置和大小;
2)初始化时为不可见,可用setVisible(true)使其显示出来;
3)默认使用BorderLayout作为其布局管理器。
举个例子:
如果读者尝试过这个程序,就会发现这个小窗口点击叉叉是关不掉的,这是因为还没有为该窗口编写任何事件响应,如果想关闭该窗口,可以通过关闭运行程序的命令行窗口来关闭该窗口。
7. Panel是AWT中另一个典型的容器,它代表不能独立存在、必须放在其他容器中。Panel外在表现为一个矩形区域,该区域内可以盛装其他组件。Panel存在的意义就是为其他组件提供空间。
Panel容器具有以下几个特点:
(1)可作为容器盛装其他组件,为放置组件提供空间;
(2)不能单独存在,必须放到其他容器中;
(3)默认使用FlowLayout为布局管理器。
举个栗子:
8. ScrollPane是一个带滚动条的容器,它也不能独立存在,特点是:
(1)可作为容器来盛装其他组件,当组件占用空间过大时,自动产生滚动条,也可以通过指定特定的构造器参数来指定默认具有滚动条。
(2)不能单独存在,必须放到其他容器中;
(3)默认使用BorderLayout作为其布局管理器。通常不允许改变ScrollPane的布局管理器。
举个栗子:
看到结果我们感觉有点奇怪,代码中设置的文本框没有显现出来,为什么呢?
这是因为ScrollPane使用BorderLayout布局管理器的缘故,它导致容器中只有一个被显现出来。具体情况我们后面介绍。
9. 布局管理器
为什么使用布局管理器?实现平台的迁移性,就是说“ Write Once,Run Anywhere”。避免因为平台的不同导致布局恶心。Java提供了LayoutManager、LayoutManager可以根据运行平台调整组建的大小,程序员要做的就是为容器选择合适的布局管理器。
AWT提供了FlowLayout、BorderLayout、GridLayout、GridBagLayout、CardLayout 5个常用的布局管理器,Swing还提供了一个BoxLayout布局管理器。
(1)FlowLayout布局管理器:
FlowLayout布局管理器从左到右排列所有组件,遇到边界就折回下一行重新开始。我们日常输入文章时用的就是FlowLayout布局管理器。
FlowLayout有三个构造器:
1)FlowLayout():使用默认的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器;
2)FlowLayout(int align):使用指定的对齐方式及默认的垂直间距、水平间距创建;
3)FlowLayout(int align,int hgap,int vgap):使用指定的对齐方式及指定的垂直间距、水平间距创建。
ps:align表示的是组件的排列方向:FlowLayout.LEFT(从左到右)、FlowLayout.RIGHT(从右到左)、FlowLayout.CENTER(从中间向两边)。
举个例子:
这个例子举得不好,没有想表达我的意思。设置的排列方式是从中间到四周(CENTER)形式。但是上面的栗子没看出来,因为有pack()方法,这个是设置窗口为最佳大小,所以看不出来,我注释了以后就变了
这个就看的比较明显了。
(2)BorderLayout布局管理器
BorderLayout将容器分为EAST、SOUTH、WEST、NORTH、CERTER 5个区域。如图所示:
当改变使用BorderLayout的容器大小时,NORTH、SOUTH、CENTER区域水平调整,而EAST、WEST、CERTER垂直调整。
使用BorderLayout有如下两个注意点:
1)添加组件时,需要指定到添加到哪个区域中,否则默认添加到中间区域中。
2)如果向同一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。
这个就解释了为什么上面的一个例子:ScrollPane栗子里没有显示文本框,因为被覆盖了。
Frame、Dialog、ScrollPane默认使用BorderLayout布局管理器,BorderLayout有两个构造器:
1)BorderLayout():使用默认的水平间距和垂直间距;
2)BorderLayout(int hgap,int vgap):使用指定的水平间距和垂直间距。
举个栗子:
但是很遗憾,我没有得到想象中的结果,今天时间有点不够了,下次再研究。5个布局管理器只说了两个,继续加油吧!