AWT编程学习笔记原创 含简略代码.docx
《AWT编程学习笔记原创 含简略代码.docx》由会员分享,可在线阅读,更多相关《AWT编程学习笔记原创 含简略代码.docx(63页珍藏版)》请在冰豆网上搜索。
AWT编程学习笔记原创含简略代码
1.AWT
1.1AWT概念
AWT全称“AbstractWindowToolkit”,即:
抽象窗口工具集。
为java应用程序提供了基本的图形组件。
ATW是窗口框架,它从不同的操作平台提取出共同组件,当程序运行时,将这些组件的创建和动作委托程序所在的运行平台。
2.AWT容器
2.1基本介绍
什么是容器?
任何窗口都可以被分解成一个空的容器,容器内盛装了大量的基本组件,通过设置这些组件的大小,属性,位置等,就可以将该容器和组件组成一个整体的窗口。
容器(Container)是Commponent的子类,因此容器对象本身也是一个组件。
Commponent类有如下的方法来设置组件的大小,位置,属性和可见性等:
setLocation(intx,inty):
设置组件的位置
setSize(intwidth,intheight):
设置组件的宽度,高度
setBounds(intx,inty,intwidth,intheight):
同时设置组件的位置,大小。
setVisible(Booleanb):
设置组件的可见性。
除此之外,容器还具有盛装其他组件的功能,容器类(Container)主要提供了一下几个常用的方法来访问容器内的组件:
Componentadd(Componentcomp)向容器中添加其他组件
ComponentgetCommponentAt(intx,inty):
返回指定点的组件
IntgetComponentCount():
返回容器内的组件个数
Component[]getComponents():
返回容器里的所有组件
AWT主要提供了两种类型的容器
Window:
可独立存在的窗口
Panel:
可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中。
AWT容器的继承关系图:
ScrollPane:
增加滚动条
Frame:
常见的窗口
Dialog:
对话框
例子:
importjava.awt.Frame;
publicclassTestFrame{
publicstaticvoidmain(String[]args){
Framef=newFrame("测试窗口");
//设置窗口的大小,位置
f.setBounds(50,100,400,300);
//设置窗口的可见性,默认是隐藏的
f.setVisible(true);
}
}
运行上面的程序,显示了一个简单的窗口
2.2Panel
Panel容器具有以下几个特点:
●可作为容器来盛装其他组件,为放置组件提供空间
●不能单独存在,必须依附于其他容器
●默认使用FlowLayout作为布局管理器
下面的例子使用Panel作为容器来盛装一个文本框和按钮
例子:
importjava.awt.Button;
importjava.awt.Frame;
importjava.awt.Panel;
importjava.awt.TextField;
publicclassTestPanel{
publicstaticvoidmain(String[]args){
Framef=newFrame();
//创建一个Panel容器
Panelp=newPanel();
//给Panel容器中添加组件
p.add(newTextField(20));
p.add(newButton("按钮"));
//将Panel添加到Frame窗口中
f.add(p);
f.setBounds(50,100,300,400);
f.setVisible(true);
}
}
运行之后我们会看到这么一个窗口:
2.3ScrollPane
ScrollPane是一个带滚动条的容器,不能独立存在。
ScrollPane具有以下特点:
●可以作为容器来盛装其他组件,当组件占用空间过大时会自动产生滚动条。
●不能单独存在
●默认使用BorderLayout作为布局管理器
我们看一个简单的例子:
importjava.awt.Button;
importjava.awt.Frame;
importjava.awt.ScrollPane;
importjava.awt.TextField;
publicclassTestScrollPane{
publicstaticvoidmain(String[]args){
Framef=newFrame("测试窗口");
//创建一个ScrollPane容器,指定总是显示滚动条
ScrollPanesp=newScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
//为ScrollPane容器添加组件
sp.add(newTextField(20));
sp.add(newButton("按钮"));
f.add(sp);
f.pack();
f.setVisible(true);
}
}
运行上面的程序我们会看到如下的结果:
3.布局管理器
为了使生成的图形用户界面具有良好的与平台无关性,java语言中,提供了布局管理器来管理组件在容器中的布局,而不使用直接设置的位置和大小。
AWT提供了FlowLayout,BorderLayout,GridLayout,GridBigLayout,CardLayout五个常用的布局管理器。
3.1FlowLayout布局管理器
在FlowLayout布局管理器中,组件像流水一样向某个方向流动(排列),遇到边界就折回。
FlowLayout有如下三个构造器
●FlowLayout();使用默认的排序方式,默认垂直,水平创建FlowLayout布局管理器
●FlowLayout(intalign)使用指定的对齐方式。
●FlowLayout(intalign,inthgap,intvgap)使用指定的对齐方式,指定水平,垂直,水平间距,创建FlowLayout布局管理器
Hgap,vgap代表水平,垂直间距
我们来看下边的例子:
importjava.awt.Button;
importjava.awt.FlowLayout;
importjava.awt.Frame;
publicclassTestFlowLayout{
publicstaticvoidmain(String[]args){
Framef=newFrame("测试窗口");
//设置Frame容器使用FlowLayout布局管理器
f.setLayout(newFlowLayout(FlowLayout.LEFT,20,5));
//向窗口中添加按钮
for(inti=0;i<20;i++)
{
f.add(newButton("按钮"+i));
}
f.pack();
f.setVisible(true);
}
}
运行上边的代码我们会看到如下结果:
3.2BorderLayout布局管理器
BorderLayout布局管理器将容器分为WAST,SOUTH,WEST,NORTH,CENTER五个区域。
使用BorderLayout时需要注意两点:
1.向使用BorderLayout布局管理器的容器中添加组件时,如果没指定哪个区域,则默认为中间
2.如果向同一区域添加组件时,前边的会被后边的覆盖
BorderLayout布局管理器有如下两个构造器
●BorderLayout();使用默认水平,垂直间距来创建布局管理器
●BorderLayout(inthagp,intvagp);使用指定的水平,垂直间距来创建布局管理器。
例子:
importjava.awt.BorderLayout;
importjava.awt.Button;
importjava.awt.Frame;
importjavax.swing.border.Border;
publicclassTestBorderLayout{
publicstaticvoidmain(String[]args){
Framef=newFrame("测试窗口");
f.setLayout(newBorderLayout(30,5));
f.add(newButton("北"),BorderLayout.SOUTH);
f.add(newButton("西"),BorderLayout.WEST);
f.add(newButton("南"),BorderLayout.NORTH);
f.add(newButton("东"),BorderLayout.EAST);
f.add(newButton("中"));
f.pack();
f.setVisible(true);
}
}
运行结果:
3.3GirdLayout布局管理器
GridLayout布局管理器将容器分割成纵横线分割的网络,每个网格所占的区域大小不同,往使用GirdLayout的容器中添加组件时,默认从左向右,从上往下。
GridLayout有如下两个构造器
●GirdLayout(introws,intcols);采用指定的行数,列数,默认横向间距,纵向间距将容器分割成多个网络
●GridLayout((introws,intcols,inthagp,intvagp);
我们用GridLayout和BorderLayout开发一个计算器的界面:
importjava.awt.BorderLayout;
importjava.awt.Button;
importjava.awt.Frame;
importjava.awt.GridLayout;
importjava.awt.Panel;
importjava.awt.TextField;
publicclassTestGridLayout{
publicstaticvoidmain(String[]args){
Framef=newFrame();
Panelp1=newPanel();
p1.add(newTextField(30));
f.add(p1,BorderLayout.NORTH);
//设置Panel使用GridLayout布局
Panelp2=newPanel();
p2.setLayout(newGridLayout(3,5,4,4));
String[]name={"0","1","2","3","4","5","6","7","8","9",
"+","-","*","/","."};
//向Panel2中添加按钮
for(Stringn:
name)
{
p2.add(newButton(n));
}
f.add(p2);
f.pack();
f.setVisible(true);
}
}
运行后我们看到这么一个简单的计算器界面
3.3GridBagLayout布局管理器
GirdBagLayout布局管理器功能最强大。
但也是最复杂的。
于GridLayout布局管理器不同的,一个组件可以跨越多个网格。
并可以设置网格的大小,从而增加了布局的灵活性
使用GridBagLayout布局管理的步骤如下:
●创建GridBagLayout布局管理器,并指定GUI容器使用该布局,代码如下:
GridBagLayoutgb=newGridBagLayout();
Constainer.setLayout(gb);
●创建GridBagLayout对象,并设置该对象的相关属性,代码如下:
gbc,gridx=2;//设置受该对象控制的GUI组件位于网格的横向索引
gbc,gridy=2;//设置受该对象控制的GUI组件位于网格的纵向索引
gbc,gridwidth=2;//设置受该对象控制的GUI组件位横跨多少网格
gbc,gridwidth=2;//设置受该对象控制的GUI组件位纵跨多少网格
●调用GridBagLayout对象的方法来建立GridBagConstainer对象和受控组件之间的关联,代码如下:
gb.setConstainer(c,gbc);//设置c组件受gbc对象控制
●添加组件
Constainer.add(c);
使用GridBagLayout布局管理器的关键在于GridBagConstainer,他才是精确控制某个GUI组件的核心,该类有如下几个方法:
●Gridxgridy设置受该对象控制的GUI组件的左上角所在的横向索引,纵向索引。
●Gridwidthgridheight设置受该对象控制的GUI组件横向,纵向跨越了多少个网格
●Fill:
设置受该对象控制的GUI组件如何占领空白区域。
●Ipadx、ipady:
设置受该对象控制的GUI组件横向,纵向的内部填充大小,即在该组件的最小尺寸的基础上还需要增加多大。
●Insets:
何止受该对象控制的GUI组件的外部填充大小,即组件边界于显示区域边界之间的距离
●Anchor:
设置受该对象GUI组件在其显示区域之中的定位方式。
●Weightx,weighty:
设置受该对象控制的GUI组件占领多余空间的水平,垂直增加比例。
默认值都是0,即不占用多余空间
3.4CardLayout
CardLayout布局管理器以时间而非空间来管理组件,他将加入容器的组件看成一叠卡片,每次只有最上边的Commponent才可以显示。
CardLayout提供了如下两个构造器:
●CardLayout():
创建默认的CardLayout布局管理器
●CardLayout(inthgap,intvgap):
通过指定卡片于容器边界的距离,来创建CardLayout布局管理器
CardLayout用于控制组件可见的5个方法:
●First(Canstainertarget):
显示target容器中的第一张卡片
●Last(Canstainertarget):
显示target容器中的最后一张卡片
●Previous(Canstainertarget):
显示target容器中前一张卡片
●Next(Canstainertarget):
显示target容器中下一张卡片
●Show(Canstainertarget,Stringname):
显示target容器中指定卡片的名字
如下的例子程序示范了CardLayout布局管理器的用法:
publicclassTestCardLayout{
Framef=newFrame();
String[]name={"第一张","第二张","第三张","第四张","第五张"};
Panelp=newPanel();
CardLayoutc=newCardLayout();
publicvoidinit(){
p.setLayout(c);
for(inti=0;ip.add(name[i],newButton(name[i]));
}
Panelp2=newPanel();
//控制显示上一张的按钮
Buttonprevious=newButton("上一张");
previous.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
c.previous(p);//显示容器里的钱一张卡片
}
});
//控制显示下一张的按钮
Buttonnext=newButton("下一张");
next.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
c.next(p);//显示容器里的钱一张卡片
}
});
//控制显示第一张的按钮
Buttonfirst=newButton("第一张");
first.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
c.first(p);//显示容器里的钱一张卡片
}
});
//控制显示最后一张的按钮
Buttonlast=newButton("最后一张");
last.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
c.last(p);//显示容器里的钱一张卡片
}
});
//控制显示第三章的按钮
Buttonthird=newButton("第三张");
third.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
c.show(p,"第三张");//显示容器里的钱一张卡片
}
});
p2.add(previous);
p2.add(last);
p2.add(first);
p2.add(next);
p2.add(third);
f.add(p);
f.add(p2,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
publicstaticvoidmain(String[]args){
newTestCardLayout().init();
}
}
运行结果如下:
绝对定位:
Java可以对GUI组件进行绝对定位,在java中采用绝对定位的步骤如下:
●将Container的布局管理器设置车改null:
setLayout(null);
●往容器中添加组件时,先调用setBounds()或setSize()的方法来设置组件的大小,位置。
或直接创建GUI组件时通过构造器来指定该组件的位置,大小,然后将该组件添加到容器中。
下面的程序示范了如何使用绝对定位来控制窗口中的GUI组件
publicclassTestNullLayout{
Framef=newFrame();
Buttonb1=newButton("第一个按钮");
Buttonb2=newButton("第二个按钮");
publicvoidinit(){
//将容器的布局管理器设置为null
f.setLayout(null);
//定义按钮的位置,大小
b1.setBounds(20,30,90,28);
f.add(b1);
b2.setBounds(50,45,120,35);
f.add(b2);
f.setBounds(50,100,400,300);
f.setVisible(true);
}
publicstaticvoidmain(String[]args){
newTestNullLayout().init();
}
}
运行效果如下:
3.5BoxLayout布局管理器
GridBagLayout布局管理器功能虽然强大,但是太复杂了。
所以Swing引入了一个新的布局管理器。
BoxLayout布局管理器可以在水平和垂直位置上放置组件。
BoxLayout提供了如下的简单构造器:
●BoxLayout(Containertarget,intaxis):
创建基于target容器的布局管理器、该布局管理器里的组件按照axis方向排列。
我们来写一个简单的例子:
publicclassTestBoxLayout{
Framef=newFrame();
publicvoidinit()
{
//添加BOxLayout布局管理器到容器中,并指定排列方式:
垂直
f.setLayout(newBoxLayout(f,BoxLayout.Y_AXIS));
f.add(newButton("按钮一"));
f.add(newButton("按钮二"));
f.add(newButton("按钮三"));
f.pack();
f.setVisible(true);
}
publicstaticvoidmain(String[]args){
newTestBoxLayout().init();
}
}
运行结果如下:
BoxLayout通常和Box容器结合使用,Box是一个特殊的容器。
他有点像Panel,但该容器默认使用BoxLayout布局管理器。
Box提供了如下两个静态方法来床架Box对象
●CreateHorizontalBox();创建一个水平排列的Box容器
●CreateVeriticalBox();创建一个垂直排列的Box容器
我们写个程序来测试一下Box容器
publicclassTestBox{
Framef=newFrame();
//定义一个水平放置组件的BOx对象
Boxx=Box.createHorizontalBox();
//定义一个垂直房子组件的Box对象
Boxy=Box.createVerticalBox();
publicvoidinit()
{
x.add(newButton("按钮一"));
x.add(newButton("按钮二"));
y.add(newButton("按钮三"));
y.add(newButton("按钮四"));
f.add(x,BorderLayout.NORTH);
f.add(y);
f.pack();