AWT编程:
Java使用AWT和Swing类完成图形用户界面编程,其中AWT的全称是抽象窗口工具集(Abstract Window Toolkit),它是Sun最早提供的GUI库,后来又提供了Swing库。
GUI(图形用户界面)和AWT:
AWT是窗口框架,它从不同平台的窗口系统中抽取出共同组件,当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台。
当使用AWT编写图形界面的应用时,程序仅指定了界面组件的位置和行为,并未提供真正的实现,jvm调用操作系统本地的图形界面来创建和平台一致的对等体。
Swing组件替换了绝大部分的AWT组件。
AWT编程有两个基类:Component和MenComponent:
Component代表一个能以图形化方式显示出来,并可与用户交互的对象。
AWT图形用户界面编程里还有两个重要概念:Container和LayoutManager,其中Container是一种特殊的Component,他代表一种容器,可以盛装普通的Component,而LayoutManager则是容器管理器中其他组件的方式。
AWT容器:
容器(Container)是Component的子类,因此容器对象本身也是一个组件,具有组件的所有性质,可以调用Component的所有方法,Component的类有如下几个常见的方法来设置组件的大小,位置和可见性等。
SetLocation(int x,int y):设置组件位置。
SetSize (int width,int heigh):设置组建的大小。
SetBounds(int x,int y,int width,int heigh):同时设置组建的位置和大小
Setvisible(Boolean b):设置该组件的可见性
容器类(Container)主要提供了如下几个常用的方法来访问容器里的组件:
Component add(Component comp):向容器中添加其他组件(组件既可以是普通组件,也可以是容器),并返回被添加的组件。
Component getComponentAt(int x,int y):返回指定的组件。
Int getComponentsCount():返回该容器内组件的数量。
Component[] getComponents():返回该容器内所有组件
AWT主要提供两种主要的容器类型:
Window:可独立存在的顶级窗口
Panel:可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中
AWT的容器的继承关系图:
Frame具有如下几个特征:
- Frame对象有标题,允许通过拖拉来改变窗口的位置,大小
- 初始化时为不可见,可用setVisible(true)使其显示出来。
- 默认使用BorderLayout作为其布局管理器
Panel是AWT中另一个典型的容器,它代表不能独立存在,必须放在其他容器中的容器,panel外在表现为一个矩形区域,该区域内可以盛装其他组件。Panel容器存在的意义在于为其它组件提供空间,panel容器具有如下特点: - 可作为容器盛装其他组件,为放置组件提供空间
- 不能单独存在,必须放置到其他容器中。
- 默认使用FlowLayout作为布局管理器
- ScrollPane是一个带滚动条的容器,它不能独立存在,必须添加到其他容器中,ScrollRane容器具有如下几个特点:
- 可作为容器来盛装其他组件,当组建占用空间过大时,scrollpane就会产生滚动条。当然也可以通过指定特定的构造器参数来指定默认具有滚动条。
- 不能单独存在,必须放置到其他容器中。
- 默认使用BorderLayout作为其布局管理器,Scroll Pane通常用于盛装其他容器所以通常不允许改变Scroll Pane的布局管理器。
布局管理器:
LayoutManager可以根据平台来调整组件的大小。为容器指定布局管理器通过调用容器
对象的setLayoutManager(LayoutManager lm)方法来完成,如:
c.setLayoutManager(new XXXLayout());
AWT 提供了FlowLayout, BorderLayout, GridLayout, GridBigLayout, Cardlayout五个常用的布局管理器,Swing还提供了一个BoxLayout布局管理器。
Flow Layout布局管理器:
默认情况下,Flow Layout布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。
Flow Layout有三个构造器: - Flow Layout():使用默认对齐方式,默认垂直,水平间距创建Flow Layout布局管理器
- Flow Layout(int align):使用指定对齐方式,默认垂直,水平间距创建Flow Layout布局管理器。
- Flow Layout(int align,int hgap,int vgap):使用指定对齐方式,指定垂直,水平间距创建Flow Layout布局管理器。
hgap,vgap代表水平间距,垂直间距,为这两个参数传入整数值即可。其中align表明
FlowLayout中组件的排列方式(从左到右,从右向左,从中间到两边等),该参数使用Flow Layout静态常量:Flow Layout.LEFT, Flow Layout.CENTER, Flow Layout.RIGHT。
Panel和Applet默认使用Flow Layout布局管理器 - f.pack():是调用该方法来将窗口调整到最佳大小。
BorderLayout布局管理器:
BorderLayout将容器分为,EAST,SOUTH,WEST,NORTH,CERTER五个区域,普通组件可以被放置在这五个区域中任意一个。
当改变使用BorderLayout的容器大小时,NORTH,SOUTH和CERTER区域水平调整,而EAST,WEST和CENTER垂直调整,使用Border Layout注意两点: - 当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到那个区域里,如果没有指定添加到那个区域里,则默认添加到中间区域里。
- 如果向同一个区域添加多个组件时,后放入的会覆盖前面的组件。
Frame,Dialog,Scroll Pane默认使用BorderLayout布局管理器,Border Layout有如下两
个构造器:
BorderLayout():使用默认水平间距,垂直间距创建BorderLayout布局管理器。
BorderLayout(int hgap,int vgap):使用指定的水平间距,垂直间距创建BorderLayout布局管理器。
GridLayout布局管理器:
Grid Layout布局管理器将容器分割成纵横线分割的网格,每个网格所占的区域大小相
同,当向使用Grid Layout的容器中添加组件时,默认从左到右,从上到下一次添加到每个网格中,与flowLayout不同的是,放在GridLayout布局管理器中的各组件的大小由组件所处的区域来决定(每个组件将自动涨大到占满整个区域)
Grid Layout有如下两个构造器: - Grid Layout(int rows,int cols):采用指定行数,列数,默认横向间距,纵向间距将容器分割成多个网格。
- Grid Layout(int rows,int cols,int hgap,int vgap):采用指定行数,列数,指定横向间距,纵向间距将容器分割成多个网格。
BorderLayout最多只能放五个组件,但可以放少于五个组件,如果某个区域没有放置组
件,该区域并不会出现空白,旁边区域的组件会自动占据该区域,从而保证窗口有较好的外观,但因为容器也是一个组件,所以我们可以先向panel里添加多个组件,再把Panel添加到BorderLayout布局管理器中,从而让BorderLayout布局管理中的实际组件数远超过五个。
GridBagLayout布局管理器:
与GridLayout布局管理器不同的是:在GridBagLayout中布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性,当窗口的大小发生变化时,GridBagLayout布局管理也可以准确的控制窗口各部分的反应。
Java提供了GridBagLayout对象,该对象与特定的GUI组件关联,用于控制该GUI组件的大小,跨越性。
1.使用GridBagLayout布局管理器,并指定GUI容器使用该布局管理器如:
Grid BagLayout gb=new Grid BagLayout();
Constainer.setLayout(gb);
2.创建GridBagConstraints对象,并设置该对象的相关属性(用于设置受该对象控制的GUI组件)如下:
gbc.gridx=2;//设置受该对象控制的GUI组件应位于网格的横向索引
gbc.gridy=1;//设置受该对象控制的GUI组件应位于网阔的纵向索引
Gbc.gridwidth=2;//设置受该对象控制的GUI组件横向跨越多少个网格
Gbc.gridheight=1;//设置受该对象控制的GUI组件纵向跨越多少个网格 - 调用GridBagConstraints对象的方法来建立GridBagConstraints对象和受控制组件之间的关联,如下代码:
gb.setConstraints(c.gbc);//设置c组件受gbc对象的控制 - 添加组件,与普通布局管理器添加组件完全一致如下:
Constainer.add©;
使用GridBagLayout布局管理器的关键在于GridBagConstraints,他才是精确控制的每个GUI组件的核心类。
如果希望某个组件的大小会随容器的增大而增大,则必须同时设置该组件的Grid Bag Constraints对象的fill属性和weightx,weighty属性。
Card Layout布局管理器:
Card Layout布局管理器以时间而非空间来管理他们的组件,他将加入容器的所有组件看成一层叠卡片,每次只有最上面的那个Component才可见,Card Layout提供了两个构造器:
Card Layout():创建默认的Card Layout布局管理器
Card Layout(int hgap,int vgap):通过指定卡片与容器左右边界间距(hgap),上下边界(vgap)的间距来创建Card Layout布局管理器。
常见的五个方法:first(Container target):显示target容器中第一个卡片
Last(Container target):显示target容器中最后一个卡片
Previous(Container target):显示target容器中前一个卡片
Next(Container target):显示target容器中后一个卡片。
Show(Container target,String name):显示target容器中指定名字的卡片
public class TestCardLayout {
Frame f=new Frame(“测试窗口”);
String[] names= {“第一张”,“第二张”,“第三章”,“第四章”,“第五张”};
Panel p1=new Panel();
CardLayout c=new CardLayout();
public void init() {
p1.setLayout©;
for (int i = 0; i < names.length; i++) {
p1.add(names[i], new Button(names[i]));
}
Panel p=new Panel();
Button pervious=new Button(“上一张”);
pervious.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.previous(p1);
}
});
Button next=new Button("下一张");
next.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.next(p1);
}
});
Button first =new Button("第一张");
first.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.first(p1);
}
});
Button last =new Button("最后一张");
last.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.last(p1);
}
});
Button third=new Button("第三章");
third.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.show(p1, "第三章");
}
});
p.add(pervious);
p.add(next);
p.add(first);
p.add(last);
p.add(third);
f.add(p1);
f.add(p,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new TestCardLayout().init();
}}
绝对定位:
Java也可以对GUI组件进行绝对定位。
步骤如下:
- 将Container的布局管理器设成null:setLayout(null);
- 往容器上加组件的时候,先调用setBounds()或setSize()方法来先设置组建的大小,位置。或者直接创建GUI组件时通过构造参数指定该组件的大小,位置,然后将该组件添加到容器中。
BoxLayout布局管理器:
Box Layout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了一个如下的简单构造器。
BoxLayout(Container target,int axis):指定创建基于target容器的Box Layout布局管理器,该布局管理器里组件按axis方向排列,其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。
BoxLayout通常和Box容器结合使用,Box是一个特殊的容器,该容器默认使用BoxLayout
布局管理器,box提供了如下两个静态方法来创建Box 对象:
CreateHorizontalBox():创建一个水平排列组件的Box容器
CreateVerticalBox():创建垂直排列组建的Box容器
BoxLayout没有提供设置间距的构造器和方法,因为BoxLayout采用另一种方式来控制组件的间距。BoxLayout使用Glue(橡胶),Strut(支架)和RigidArea(刚性区域)组件来控制组件间的距离。其中Glue代表可以在横向,纵向两个方向同时 拉伸的空白组件(间距),
Strut代表可以在横向,纵向任意一个方向上拉伸的空白组件(间距),RigitArea代表不可拉伸的空白组件(间距)
Box提供了如下五个静态方法来创建Glue,Strut和Rigid Area
CreateHorizontalGlue():创建一条水平Glue(可在两个方向同时拉伸的间距)
CreateVerticalGule():创建一条垂直的Glue(可在两个方向同时拉伸间距)
CreateHorizontalStrut(int width):创建一条指定宽度水平Strut(可在垂直方向上拉伸的间距)
createVerticalStrut(int height):创建一条指定高度垂直Strut(可在水平方向上拉伸的间距)
createRigidArea(Dimension d):创建指定宽度,高度的Rigid Area(不可拉伸的间距)