第九章 Java 图形程序设计入门.docx
- 文档编号:11104426
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:62
- 大小:229.60KB
第九章 Java 图形程序设计入门.docx
《第九章 Java 图形程序设计入门.docx》由会员分享,可在线阅读,更多相关《第九章 Java 图形程序设计入门.docx(62页珍藏版)》请在冰豆网上搜索。
第九章Java图形程序设计入门
第三篇图形程序设计
第8章图形程序设计入门
从软件体系结构上看,通常将软件分为3层,即客户层、逻辑层、数据层。
其中,客户层软件的职责是提供数据输入/输出的图形界面。
在Java语言中,图形界面是通过AWT类库和Swing类库来实现的。
本章将介绍Java图形类库的应用。
8.1图形类库简介
类库就是由多个类构成的库。
实现图形界面时用到java系统的两组类库:
●AWT类库。
又称为重型类库,保存在java.awt包中。
刚引入Java时,使用此类库实现图形界面。
●Swing类库。
又称为轻型类库,保存在javax.swing包中。
随着Java2的发行,在实现图形界面时以Swing类库取代了AWT类库。
AWT类库和Swing类库构成的类层次结构如图8-1所示。
图8-1类层次结构图
注意:
(1)非J字母开头的类都属于AWT类库。
(2)以J字母开头的类属于Swing类库。
(3)在Swing类库中,只有JApplet、JFrame和Jdialog3个类创建的对象是重型组件。
图8-1是java类库的类层次结构图。
根据类在界面设计方面的用途,我们把类分成3组,它们是:
辅助类、重型组件类和轻型组件类。
8.1.1辅助类
辅助类属于AWT类库。
在界面设计时,辅助类的作用是绘图和设置容器组件的布局方式。
常用的辅助类有Graphics、Color、Font、FontMetrics、LayoutManager。
8.1.2重型类库
重型类库中的类创建的组件是重型组件。
在界面设计时,重型组件主要用于创建用户界面元素。
早期的图形用户界面设计都采用重型组件。
重型组件又称为AWT组件。
由AWT类库中的类(加上JApplet、JFrame和Jdialog3个类及其子类)创建的对象称为重型组件,如Button、Label、Frame、Dialog等都是重型组件。
1.重型组件的特点
重型组件的特点如下:
●重型组件依赖本地GUI资源。
●重型组件只适用于简单的GUI程序设计,不适用于复杂的GUI项目。
●重型组件易发生平台故障,不稳定,不灵活。
2.重型组件分类
重型组件又分为容器组件和非容器组件两类。
能包含其他组件的组件称为容器组件;不能包含其他组件的组件称为非容器组件。
例如,用Panel、Window、JFrame、JDialog、JApplet及其子类创建的组件是容器组件;用Button、Label及其子类创建的组件是非容器组件。
3.重型组件的类层次结构图
重型组件的类层次结构图如图8-2所示。
图8-2重型组件类层次结构图
8.1.3轻型类库
轻型类库中的类创建的组件是轻型组件(除JApplet、JFrame和Jdialog3个类及其子类以外))。
在界面设计时,轻型组件类主要用于创建用户界面元素。
随着Java2的发行,图形设计时以轻型组件取代了重型组件。
常用到的轻型组件由类JButton、JLabel、JTextField、JTectArea、JConmboBox、JList、JRadioButton和Jmenu创建的。
1.轻型组件的特点
轻型组件的特点如下:
●轻型组件不依赖本地GUI资源。
●轻型组件适用于复杂的GUI项目。
●轻型组件比重型组件更稳定、通用和灵活。
2.轻型组件分类
轻型组件又分为容器组件和非容器组件两类。
由于JComponent的父类是Container,因此所有轻型组件都有容器特征。
注意:
Swing组件不能取代AWT的全部组件,只能取代AWT的用户界面组件(Button、TextField、TextArea等)。
在界面设计时,仍需继续使用辅助类(Graphics、Color、Font、FontMetrics、LayoutManager)。
此外,Swing组件继续采用AWT组件的事件模型。
8.2容器(Container类)
容器是一种特殊组件,它能容纳其他的组件。
Java中有两种主要容器,即窗口(Window)和面板(Panel),它们都是容器类Container的子类对象。
窗口是可以自由移动的、能独立存在的容器,它又可分为框架(Frame)和对话框(Dialog);面板与窗口类似,但不能独立存在,必须包含在另外一个容器中,如包含在Frame或Applet类及其子类创建的容器中。
在图形界面设计中,常使用Frame、Applet及其子类对象作为容器来存放用户界面组件。
应用程序使用框架及其子类对象作为容器,即在Frame对象(或子类对象)上放置面板来控制图形界面的布局;小程序使用Panel类及其子类(Applet或Japplet的子类)创建的对象作为容器(Applet对象是一个能够嵌入浏览器运行的特殊容器)。
8.2.1框架(JFrame)
JFrame是Window类的子类,是一种带标题框并且可以改变大小的窗口。
框架类的许多方法是从其超类Window或更上层的类Container和Component继承过来的。
下面介绍框架类的构造方法和常用方法。
1.JFrame中的常用方法
JFrame类本身定义了一些方法外,它还从它的父类链条中继承了一些方法。
(1)JFrame类本身定义的构造方法和实用方法
●JFrame():
创建一个无标题的窗口。
●JFrame(Stringtitle):
创建一个标题为title的窗口。
其中,参数title指定窗口的标题。
没有参数时,则窗口无标题。
窗口的默认布局是BorderLayout布局。
●publicvoidsetTitle(Stringtitle):
设置窗口的标题为title。
●publicStringgetTitle():
获取窗口的标题。
●publicvoidsetBackground(Colorcolor):
设置窗口的背景颜色为color。
●publicvoidsetResizable(booleanbol):
设置窗口是否可调整大小,窗口默认是可调整大小的。
bol的值是true时,表示可以调整窗口大小。
●booleanisResizable():
获取窗口是否可调整大小的信息,如果可调整窗口大小,该方法返回true,否则返回false。
(2)从Component类中继承的方法
●publicvoidsetLocation(intx,inty):
设置窗口位置。
调用该方法后,将窗口的左上角的坐标位置设置为(x,y)也就是距屏幕左面x像素,距屏幕上方y像素。
●publicvoidsetBounds(intx,inty,intwidth,intheight):
设置窗口的大小和位置。
调用该方法后,将窗口安排在屏幕上的一指定位置,即窗口左上角的坐标位置为(x,y)(也就是距屏幕左面x像素,距屏幕上方y像素);窗口的宽是width,高是height。
●publicvoidsetSize(intwidth,intheight):
设置窗口的大小。
这时窗口左上角坐标是(0,0)。
●publicvoidsetVisible(booleanvis):
设置窗口是否可见,窗口默认是不可见的。
vis的值是true时,窗口是可见的。
(3)从Container类中继承的方法
●publicComponentadd(Componentcomp):
在容器中添加一个组件comp。
一个窗口中可以放置多个组件。
●publicvoidsetLayout(LayoutManagermgr):
将窗口的布局管理器设置为mgr。
●publicvoidvalidate():
调用该方法,确保窗口中添加的组件能显示出来。
显示窗口时,有可能看不到窗口中的组件,当用户调整窗口大小时才能看到这些组件。
如果窗口调用了该方法,就不会发生这种情况。
另外,当窗口调用方法setSize()或setBounds()调整窗口大小后,都应该调用方法validate()以确保当前窗口中添加的组件能显示出来。
(4)从Window类中继承的方法
●publicvoiddispose():
调用该方法,将撤销当前窗口,并释放当前窗口所使用的资源。
2.创建框架(JFrame)
下面的程序是创建一个带标题的窗口。
【例8.1】创建并显示一个框架(框架是窗口的一种)。
程序名:
MyFrame.java
【程序源代码】
importjavax.swing.*;
publicclassMyFrame
{
publicstaticvoidmain(String[]args)
{JFrameframe=newJFrame("我是窗口标题");//创建一个窗口
frame.setSize(300,300);//设置窗口大小
frame.setVisible(true);//使窗口可见
//JDK1.3关闭窗口的语句格式如下:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//当窗口产生关闭事件时,关闭窗口
}
}
在默认情况下,框架对象不可见,处于最小化状态(即框架的宽和高都是0)。
必须通过setSize()方法设置框架的大小,通过setVisible(true)方法使框架变为可见。
3.框架居中
默认情况下,框架在屏幕的左上角显示。
要指定框架显示位置,必须使用JFrame类中的方法setLocation(x,y)将框架的左上角位置安排在(x,y)处。
要把框架放在屏幕的中心位置,需要知道框架和屏幕的宽和高,以便计算出将框架居中时框架左上角的坐标。
可以通过java.awt.Toolkit类得到屏幕的宽和高。
(1)获取屏幕的宽度和高度
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
intscreenWidth=screenSize.width;//获取屏幕的宽度
intscreenHeight=screenSize.height;//获取屏幕的高度
(2)框架居中时左上角的坐标(x,y)
DimensionframeSize=frame.getSize();
intx=(screenWidth-frameSize.width)/2;
inty=(screenHeight-frameSize.height)/2;
【例8.2】创建一个框架并显示在屏幕中心。
程序名:
CenterFrame.java
【程序源代码】
importjavax.swing.*;
importjava.awt.*;
publicclassCenterFrame
{
publicstaticvoidmain(String[]args)
{
JFrameframe=newJFrame("框架居中");
frame.setSize(300,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//当窗口产生关闭事件时,关闭窗口
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕的大小
intscreenWidth=screenSize.width;intscreenHeight=screenSize.height;
//获取框架的大小
DimensionframeSize=frame.getSize();
intx=(screenWidth-frameSize.width)/2;
inty=(screenHeight-frameSize.height)/2;
frame.setLocation(x,y);//设置框架的位置,其左上角坐标为(x,y)
frame.setVisible(true);//使框架可见
}
}
4.在框架中添加组件
JFrame类创建的窗口中还包含一个内容窗格,使用getContentPane()方法获取窗口(JFrame)的内容窗格。
要向窗口中添加组件,就是指向窗口的内容窗格中添加组件。
此时可以把内容窗格看作是嵌入到窗口中的一个容器。
Fame类创建的窗口不包含内容窗格,因此,直接用add(Componentcomp)方法向窗口(Frame类创建的窗口)中添加组件就可以了。
【例8.3】向框架中添加组件。
程序名:
Addcom.java
【程序源代码】
importjavax.swing.*;
publicclassAddcom
{
publicstaticvoidmain(String[]args)
{
JFrameframe=newJFrame("向框架中添加组件");
frame.getContentPane().add(newJButton("我是一个按钮"));//向内容窗格添加按钮
frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//当收到关闭事件时,关闭窗口
}
}
表达式frame.getContentPane()的作用是获取框架JFrame的内容窗格;表达式newJButton("OK")则用于创建JButton类对象。
内容窗格有自已的默认布局管理器(BorderLayout),默认布局管理器将按钮放到框架的中央。
。
注意:
要创建一个应用程序界面,必须使用Frame类或其子类创建一个窗口;要创建一个小程序界面,必须使用Applet类或其子类创建一个窗口。
这些独立的窗口作为容器,用来存放其他界面元素或容器。
窗口是不能嵌套的。
8.2.2面板(JPanel)
面板类(Jpanel)是Container类的子类,是一种没有标题的容器。
面板不能独立存在。
创建面板后,必须使用Container类的add()方法将它装入到另一面板或框架中。
面板有两个作用:
一是作为容器,把其它组件组织在一起;二是在面板上绘制字符串和图形。
1.构造方法
publicJPanel();
publicJPanel(LayoutManagerlayout);
其中,参数layout指定面板的布局管理器,没有参数时,面板使用默认的布局管理器(FlowLayout)。
面板类的主要方法都是从Container和Component类继承过来的,在此从略。
注意:
所谓布局管理器(是一个对象)是一种如何在容器中摆放组件的规则,每个容器都有自已的默认布局管理器。
在下一节将会讲到。
2.用面板作容器
【例8.4】使用面板组织组件,创建一个电话拨号键盘界面。
程序名:
TestPhone.java
【程序源代码】
importjava.awt.*;importjavax.swing.*;
publicclassTestPhoneextendsJFrame
{
publicTestPhone()//构造方法
{
Containercontainer=getContentPane();//获取框架的内容窗格
container.setLayout(newBorderLayout());//为内容窗格设置布局管理器
//创建容纳12个按钮的面板p1并为面板设置网格布局管理器(4行3列):
JPanelp1=newJPanel();
p1.setLayout(newGridLayout(4,3));
for(inti=1;i<=9;i++){p1.add(newJButton(""+i));}//向面板p1添加按钮
p1.add(newJButton("*"));p1.add(newJButton(""+0));
p1.add(newJButton("#"));
JPanelp2=newJPanel();//创建面板p2,用来容纳文本域和面板p1
p2.setLayout(newBorderLayout());p2.add(p1,BorderLayout.CENTER);
//将面板p2和按钮添加到内容窗格
container.add(p2,BorderLayout.SOUTH);
container.add(newButton("PresstoCall"),BorderLayout.CENTER);
}
publicstaticvoidmain(String[]args)//主方法
{
TestPhoneframe=newTestPhone();
frame.setTitle("TheFrontViewofaMicrowaveOven");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//当收到关闭事件时,关闭窗口
frame.setSize(400,300);
frame.setVisible(true);
}
}
【程序注释】
面板类JPanel是Container类的子类,是一种没有标题的容器。
面板不能独立存在,创建面板后,必须使用Container类的add()方法将它装入到另一面板或框架中。
【程序运行结果】程序运行结果如图8-3所示。
图8-3TestPhone.java运行结果
8.3布局管理器
每个容器都有一个默认的布局管理器。
如何在容器中摆放组件是容器的布局管理器的职责。
布局管理器就是一个布局对象。
java.awt包中有5个常见的布局类,分别是FlowLayout、GridLayout、BorderLayout、CardLayout和GridBagLayout。
我们使用它们来创建布局对象。
假设container是容器对象,对容器常见的3种操作如下:
1.设置容器的布局管理器
container.setLayout(newspecificlayout());//将容器container的布局管理器改为newspecificlayout()
表达式newspecificlayout()表示用布局管理器类创建一个布局管理器(对象),容器使用该布局管理器对容器中的组件进行摆放。
2.向容器添加组件
container.add(component);//把组件component添加到容器container中
3.从容器中删除组件
container.remove(component);//把组件component从容器container中删除掉
8.3.1FlowLayout布局
用FlowLayout类创建的对象称为FlowLayout布局对象,它是JPanel型容器的默认布局对象。
FlowLayout布局规则:
向容器中添加组件时,从容器的第一行开始,按组件添加的顺序,由左到右将组件排列在容器中,第一行排满后,再从第二行开始从左向右排列组件,依次类推,直到所有组件排完。
组件之间的对齐方式可以使用FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEFT3个常量之一指定。
FlowLayout类常用的方法如下:
(1)FlowLayout():
利用该构造方法可以创建一个布局对象,容器使用该布局对象时,组件之间的水平和垂直间距默认是5像素。
例如:
FlowLayoutflow=newFlowLayout();//创建布局对象flow
con.setLayout(flow);//容器con使用布局对象(flow)摆放容器中的组件
当向容器(con)中添加组件时,组件按照加入的先后顺序,从左向右排列,一行排满之后就转到下一行继续从左至右排列。
每一行中的组件都居中排列,组件之间的默认水平和垂直间距是5像素。
(2)FlowLayout(intaligin,inthgap,intvgap):
利用该构造方法可以创建一个布局对象,则容器中组件的对齐方式aligin可取FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout
.RIGHT之一。
(3)publicvoidsetAlignment(intaligin):
FlowLayout布局对象调用该方法可以设置布局的对齐方式。
(4)publicvoidsetHgap(inthgap):
FlowLayout布局对象调用该方法可以设置容器中组件的水平间距为hgap象素。
(5)publicvoidsetVgap(inthgap):
FlowLayout布局对象调用该方法可以设置容器中组件的垂直间距为hgap象素。
FlowLayout布局非常简单,每一行中的组件都按着布局指定的对齐方式和水平间距排列;当形成多行组件时,行与行之间的间距就是布局的垂直间距。
尽管这种布局非常方便,但是当容器内的组件太多时,就显得高低参差不齐。
为了布局的美观,我们常采用容器嵌套的方法,即把一个容器嵌入到另一个容器中,使整个容器的布局达到应用的需求。
【例8.5】使用FlowLayout布局放置9个组件。
程序名:
FlowLayoutTest.java
【程序源代码】
importjava.awt.*;importjava.applet.*;
publicclassFlowLayoutTestextendsApplet
{
publicvoidinit()
{
FlowLayoutfL=newFlowLayout();
fL.setAlignment(FlowLayout.RIGHT);
fL.setHgap(30);//设置组件的垂直间距为30像素
fL.setVgap(40);//设置组件的水平间距为40像素
setLayout(fL);//设置容器的布局对象为fL
setBackground(Color.blue);
for(intn=1;n<=9;n++)
{add(newButton("Thisis"+n));//向容器中添加按钮}
}
}
【程序运行结果】程序运行结果如图8-4所示。
图8-4FlowLayoutTest.java运行结果
【例8.6】在一个框架中以指定的对齐方式和间距排列12个按钮。
程序名:
ShowFlowLayout.java
【程序源代码】
//使用FlowLayout布局对象
importjavax.swing.JButton;importjavax.swing.JFrame;
importjava.awt.Container;importjava.awt.FlowLayout;
publicclassShowFlowLayoutextendsJFrame
{
publicShowFlowLayout()
{
Containercontainer=getContentPane();//获取框
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九章 Java 图形程序设计入门 第九 图形 程序设计 入门
![提示](https://static.bdocx.com/images/bang_tan.gif)