




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章数组、字符串、向量第1页,共159页。主要内容5.1 数组一维数组二维数组5.2 字符串字符串常量String类StringBuffer类StringTokenizer类5.3 向量2*第2页,共159页。5.1 数组数组是有序数据的集合,是由数目固定、相同类型的元素组成的,用一个统一的数组名和下标来唯一地确定数组中的元素。Java将数组作为对象来处理,数组是一种引用类型,从java.lang.Object继承而来,故Object类中的所有方法均可用。 3*第3页,共159页。5.1.1 一维数组具有一个下标的数组称为一维数组。1. 一维数组的声明其声明格式如下:这里只有数组变量的定义,
2、没有为数组元素分配空间,只为数组的引用分配了空间,array1和array2目前为空的引用。 方式一:数据类型 数组名;方式二:数据类型 数组名;例如:int array1;double array2;4*第4页,共159页。2. 一维数组的初始化 一维数组定义之后,必须经过初始化才可以引用,数组经过初始化后,其长度(即可存放的元素个数)就不可再改变。数组的初始化分为静态初始化和动态初始化两种:(1) 静态初始化:在定义数组的同时对数组元素进行初始化 int intArray=1,2,3,4; / 定义了一个含有4个元素的int型数组注意: 在给数组赋初值时,不能同时指定数组的大小,Java会
3、根据初值的多少自动计算数组的大小。 静态初始化必须使用上述一条语句完成 当创建数组后,如果没有初始化,系统会根据数组的不同数据类型,指定不同的缺省值。 5*第5页,共159页。(2) 动态初始化:用运算符new为数组分配空间 对于简单类型的数组,其格式如下:数据类型 数组名=new 数据类型arraySize;数据类型 数组名=new 数据类型arraySize;其中arraySize表示数组长度,通常为整型常量,用以指明数组元素的个数。或先声明数组,再对数组进行初始化:数据类型 数组名;数组名=new 数据类型arraySize;6*第6页,共159页。 对于复合(引用)类型(类、接口、数组
4、)的数组,需要经过以下两步进行内存空间的分配。首先:为数组分配空间,每一个数组元素都是一个引用,格式为:数组名=new 数据类型arraySize;然后为每一个数组元素分配所引用的对象空间,格式为:数组名i=new 数组元素对象的构造函数; 例如:String stringArray; /定义一个String类型的数组stringArray = new String3; 上述语句给数组stringArray分配3个引用空间,初始化每个引用值为nullstringArray0=new String(how);stringArray1=new String(are);stringArray2=ne
5、w String(“you”);(如图示)7*第7页,共159页。8*第8页,共159页。3. 一维数组元素的的引用 当数组初始化后就可通过数组名与下标来引用数组中的每一个元素。一维数组元素的引用格式如下:数组名int类型的表达式注意:(1) 与C/C+不同的是,Java对数组元素的下标要进行越界检查,以保证访问的安全性。若数组下标越界,Java会抛出java.lang.ArrayIndexOutOfBoundsException异常。(2) length是属于数组对象的数据域而不是方法。因此,使用length()会出错,length只有在数组创建后才能访问。创建前,数组的引用是null。(3
6、) 与C、C+中不同,Java对数组元素要进行越界检查以保证安全性。 9*第9页,共159页。4. 数组的复制一个简单的赋值语句并不能完成数组复制工作,在Java中,可以使用赋值语句复制基本类型的变量却不能复制对象,如数组。将一个对象赋值给另一个对象,只会使两个对象指向相同的内存地址。 赋值数组有以下三种方法:(1) 用循环语句复制数组的每一个元素,如for(int i=0;isourceArray.length;i+) targetArrayi=sourceArrayi;(2) 使用Object的clone方法,如:int targetArray = (int)sourceArray.clo
7、ne();(3) 使用System类中的静态方法arraycopy,arraycopy的语法如下:arraycopy(sourceArray,srcpos,targetArray,tarpos,length); 10*第10页,共159页。5. 程序举例【例5.2】用数组求解Fibonacci数列的前20项,即使用数组下标表达式求解数学上的迭代问题。【例5.3】用冒泡法和选择法两种方法对N个数排序(升序)。11*第11页,共159页。图5.2 对5个数据进行冒泡法排序12*第12页,共159页。5.1.2 二维数组如果数组的元素类型也是数组,这种结构就是多维数组。多维数组的维数没有限制,可以为
8、二维、三维等。最常用的二维数组是一个特殊的一维数组,它的每个元素都是一个一维数组,又叫做数组的数组。表示矩阵或表格需要使用二维数组。1. 二维数组的声明数据类型 数组名;或数据类型 数组名;例如:int arr;或 int arr;13*第13页,共159页。2. 二维数组的初始化 二维数组的初始化也分为静态初始化和动态初始化两种。(1) 静态初始化:在定义数组的同时为数组分配空间,例如:int intArray=1,2,2,3,3,4;(2) 动态初始化:对高维数组来说,动态分配内存空间有下面两种方法: 直接为每一维分配空间,格式如下: (举例说明)数据类型 数组名=new数据类型数组长度;
9、或数据类型 数组名=new 数据类型数组长度数组长度;14*第14页,共159页。例如:int intArray1=new int4;int intArray2=new int43; /*定义了一个二维数组intArray2,分配了12个存储单元,类似一个4行3列的矩阵。*/需要注意的是不指定行数而指定列数是错误的。例如,下面的初始化是错误的。int arr=new int4; / 错误15*第15页,共159页。 从最高维开始(而且必须从最高维开始),分别为每一维分配空间。在这种情况下,第2维的每一个数组的长度可以不同,是一个不规则的二维数组。不规则的数组可以节省存储空间。 例如:Strin
10、g s =new String2 ;s0=new String2;s1=new String3;s00=new String(Good);s01=new String( Luck);s10=new String( to);s11=new String( you);s12=new String(!); 16*第16页,共159页。3. 二维数组的引用对二维数组中的每个元素,引用方式为:数组名index1index2其中index1和index2是数组下标,为整型常数和整型表达式,都是从0开始的。二维数组也有length属性,可以求每一维数组的长度。对于:int x = new int34;17*
11、第17页,共159页。【例5.5】测定数组的长度及数组赋值。public class twoDimensionArray public static void main(String arg) int matrix = 1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5 ; System.out.println(the length of matrix is +matrix.length); for (int i=0;i5;i+) System.out.println(the length of matrix+i+ is +matrixi.length);
12、18*第18页,共159页。【例5.6】求二维数组中的最大数。【例5.7】矩阵的加法和乘法运算。19*第19页,共159页。5.2 字符串字符串是多个字符的序列,是编程中常用的数据类型。 在纯面向对象的Java语言中,将字符串数据类型封装为字符串类,无论是字符串常量还是字符串变量,都是用类的对象来实现的,在对象中封装了一系列方法来进行字符串处理。 20*第20页,共159页。5.2.1 字符串常量一个字符串常量使用双引号括住的一串字符,字符常量是用单引号括住的一个字符。一个字符串常量是一个String对象,故可以使用String类中的各种方法。注意:若Java程序中多处出现字符串常量如ABC,
13、则Java编译程序只创建一个String对象,所有的字符串常量ABC将使用同一个String对象。如:String s1=ABC;String s2=ABC;String s3=new String(ABC); 上述三条语句创建了三个对象,其中s1和s2是同一个对象,而s1和s3是2个不同的对象,尽管它们所表示的字符序列相等。21*第21页,共159页。5.2.2 String类1. String类的构造方法String类中提供了多种构造方法来创建String类的对象。 (1) public String();功能:创建一个字符串对象,其字符串值为空。(2) public String(Str
14、ing value);功能:用字符串对象value创建一个新的字符串对象。(3) public String(char value);用字符数组value来创建字符串对象。(4) public String(char value,int offset,int count)从字符数组value中下标为offset的字符开始,创建有count个字符的字符串对象。22*第22页,共159页。(5) public String(byte ascII)用byte型字符串数组ascII,按缺省的字符编码方案创建字符串对象。(6) public String(byte ascII,int offset in
15、t count)从字节型数组ascII中下标为offset的字符开始,按缺省的字符编码方案创建count个字符的串对象。(7) public String(StringBuffer buffer)用缓冲字符串buffer创建一个字符串对象。【例5.8】String类的构造方法的使用。23*第23页,共159页。2. String类的常用成员方法 创建一个String类的对象后,使用相应类的成员方法对创建的对象进行处理。String类的常用成员方法见表5.3。说明:(1) 关于字符串比较的说明不能用“=” ,而用equals()方法。(2) 程序设计中频繁使用字符串。(3) 类型转换String
16、类的静态方法valueOf()实现简单数据转化为字符串 。类Integer、Double、Float和Long中也提供了方法valueOf()把一个字符串转化为对应的数字对象类型 示例:参看例5.1024*第24页,共159页。5.2.3 StringBuffer类StringBuffer类也是java.lang.Object的子类。与String类不同,StringBuffer类是一个在操作中可以更改其内容的字符串类。即一旦创建StringBuffer类的对象,在操作中可以更改和变动字符串的内容。也就是说对于StringBuffer类的对象不仅能进行查找和比较等操作,也可以做添加、插入、修改
17、之类的操作。25*第25页,共159页。1. StringBuffer类的构造函数StringBuffer类提供了多种构造方法来创建类StringBuffer的对象。(1) public StringBuffer()功能:创建一个空字符串缓冲区,默认初始长度为16个字符。(2) public StringBuffer(int length)功能:用length指定的初始长度创建一个空字符串缓冲区(3) public StringBuffer(String str)功能:用指定的字符串str创建一个字符串缓冲区,其长度为str的长度再加16个字符。26*第26页,共159页。2. StringB
18、uffer类中追加和插入新内容 StringBuffer类提供了10个重载方法append,可以在字符串缓冲区末尾追加boolean、char、字符数组、double、float、int、long、string、Object等类型的新内容,append方法的返回类型均为StringBuffer。StringBuffer类还提供了9个重载方法insert,可以在字符串缓冲区中指定位置处插入char 、字符数组、double、float、int、long、boolean、string、Object等类型的新内容。insert方法的返回类型均为StringBuffer。【例5.11】将给定不同数据类
19、型的内容添加到当前字符串后面。27*第27页,共159页。3. StringBuffer类的常用成员方法 java.lang.StringBuffer常用成员方法参见表5.4。【例5.12】测试字符串缓冲区的长度和容量。 28*第28页,共159页。5.2.4 StringTokenizer类 在Java类库的java.util包中包含一个用于进行字符串词法分析的类StringTokenizer,目的是将对字符串进行分解的方法进行封装,以简化应用程序设计过程中的工作量。1StringTokenizer类的构造方法(1) public StringTokenizer(String str)(2)
20、 public StringTokenizer(String str,String delim)(3) public StringTokenizer(String str,String delim,boolean returnTokens)29*第29页,共159页。2StringTokenizer类的常用成员方法(1) public int countTokens()功能:返回字符串中的当前单词的数量,为整数。(2) public boolean hasMoreTokens()功能:若还有子串,则返回true,否则返回false。(3) public String nextToken()功能
21、:返回下一个子串。(4) public String nextToken(String delim)功能:重置delim中的分隔符后,返回串中下一个子串。30*第30页,共159页。3. 程序设计举例【例5.13】测试StringTokenizer类。31*第31页,共159页。5.3 向量Java中的数组只能保存固定数目的元素,且必须把所有需要的内存单元一次性的申请出来,即数组一旦创建它的长度就固定不变,所以创建数组前需要知道它的长度。如果实现不知道数组的长度,就需要估计,若估计的长度比实际长度大,则浪费有用的存储空间,若比实际长度小,则不能存储相应的信息。为了解决这个问题Java中引入了向
22、量类Vector。Vector也是一组对象的集合,但相对于数组,Vector类可以根据需要动态伸缩,可以追加对象元素数量,可以方便的修改和维护序列中的对象。需要注意的是Vector类中对象不能是简单数据类型。32*第32页,共159页。向量比较适合在如下情况下使用:(1) 需要处理的对象数目不定,序列中的元素都是对象或可以表示为对象。(2) 需要将不同类的对象组合成一个数据序列。(3) 需要做频繁的对象序列中元素的插入和删除。(4) 经常需要定位序列中的对象和其他查找操作。(5) 在不同的类之间传递大量的数据。33*第33页,共159页。1. Vector类的构造方法(1) Vector()功
23、能:构造一个空的向量(2) Vector(int capacity)功能:以指定的存储容量构造一个空的向量(3) Vector(int capacity, int capacityIncrement)功能:以指定的存储容量和容量增量构造一个空的Vector。如:Vector MyVector=new Vector(100,50);34*第34页,共159页。2. Vector类的常用成员方法常用成员方法参见表5.5 【例5.14】测试Vector类。先创建Vector对象,再删除掉其中的所有字符串对象“to”。35*第35页,共159页。第6章 异常处理第36页,共159页。主要内容Case:
24、TryCatchDemo.java6.1 异常处理概述什么是异常为何采用异常处理6.2 异常的分类与层次6.3 异常的处理机制对异常处理的进一步讨论作业37*第37页,共159页。6.1 异常处理概述6.1.1 什么是异常异常就是在程序的运行过程中所发生的意外事件,它中断指令的正常执行。Java中提供了一种独特的处理异常的机制,通过异常来处理程序设计中出现的错误。38*第38页,共159页。6.1.2 为何使用意外处理:把出错处理和正常代码分开。比如有程序是处理文件,大家看流程,这个流程中充满了错误可能。readFile 打开文件;打不开咋办? 判断大小;大小判断失败怎么办?(磁带) 分配内存
25、;内存不够 读入内存;文件读不出来 关掉文件; 文件关不掉。解决方法:写大量的if语句。39*第39页,共159页。传统的错误检测和纠正errorCodeType readFile initialize errorCode = 0; 打开文件;if (打开文件成功) 判断文件长 if (文件长取到) 分配内存 if (分内存成功) 读入内存 if (读文件失败) errorCode = -1; /读文件判断 else errorCode = -2; /分配内存失败 else errorCode = -3; /取不到文件长 关闭文件; if (文件没关& errorCode = 0) error
26、Code = -4; else errorCode = errorCode and -4; else errorCode = -5; return errorCode;40*第40页,共159页。从上面的流程可看出真正有用的代码不多,就五条而已,其它全部是判断错误用的,主要逻辑都被错误处理代码混得看不清了,程序可读性差,出错返回信息量太少。在Java中,处理这种情况的方法是利用异常处理,把出错处理和正常代码分开,Java异常处理通过5个关键字try,catch,finally,throw和throws进行管理。 41*第41页,共159页。Java的解决方式readFile /结构清楚,无需自
27、己判断,代码量小。 try 打开文件; 判断大小; 分配内存; 读入内存; 关掉文件; catch (文件打开失败) 处理代码; catch (大小取不到失败) 处理代码; catch (内存分配失败) 处理代码; catch (读取失败) 处理代码; catch (文件关闭失败) 处理代码; 42*第42页,共159页。6.2 异常类的分类与层次6.2.1 异常类的层次结构在jdk中,每个包中都定义了异常类,而所有的异常类都直接或间接地继承于java.lang.Throwable类。当Java程序遇到不可预料的错误时,会实例化一个从Throwable类继承的对象。 java中的异常类可分为两
28、大类: Error: 错误Error类指的是系统错误或运行环境出现的错误,这些错误一般是很严重的错误,即使捕捉到也无法处理,由Java虚拟机生成并抛出,包括系统崩溃、动态链接失败、虚拟机错误等,在Java程序中不做处理。 Exception: 异常Exception类则是指一些可以被捕获且可能恢复的异常情况,是一般程序中可预知的问题。对于异常可分为两类:(1) 运行时异常:程序中可以不做处理,直接由运行时系统来处理。(2) 非运行时异常:在程序中必须对其进行处理,否则编译器会指出错误。 43*第43页,共159页。异常类的结构层次 44*第44页,共159页。6.2.2 Exception类1
29、. Exception类的构造方法Exception类有两种构造方法:Exception():没有指定的消息串,直接构造一个Exception。Exception(String exp):根据参数提供的消息串,创建一个Exception。例如,创建一个异常对象:Exception myExp=new Exception(“异常!”);45*第45页,共159页。2. 常用方法Exception类的方法均继承自Throwable类,可以为程序提供一些有关异常的信息,常用方法如下:String getMessage() :返回该异常所存储的描述性字符串。String toString():返回异常
30、对象的详细信息,包含该类名和指出所发生问题的描述性消息的字符串。void printStackTrace():将异常发生的路径,即引起异常的方法调用嵌套序列打印到标准错误流。例如:System.out.println(myExp.getMessage();此语句可以将异常对象myExp的异常信息描述打印输出,在屏幕上显示“异常!”。 46*第46页,共159页。6.2.3 自定义异常类在程序中,可以创建自定义的异常类。用户自定义的异常类都要直接或间接地继承Exception类。可按照下面的方法自定义一个异常类:(1) 创建一个继承Exception类或者其它已存在的异常类的子类。(2) 在该类
31、中创建一个默认的无参数构造方法,该构造方法以适当的错误消息作为输入,调用它的超类的构造方法。(3) 再增加一个带字符串参数的构造方法,该构造方法以适当的错误消息作为输入(还包括输入的字符串)来调用其超类相应的构造方法。 47*第47页,共159页。例如,定义一个继承于Exception类的用户自定义异常类,语句如下:class MyException extends Exception MyException() super(“数据错误!”); MyException(String exp) super(exp); 48*第48页,共159页。6.3 异常的处理机制每当Java程序运行过程中发
32、生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。这就是Java的异常处理机制。 49*第49页,共159页。Java中处理异常有两种方式:捕获异常、声明抛弃异常。捕获异常,就地解决,并使程序继续执行。声明抛出异常也就是将异常向外转移,即将异常抛出方法之外,由调用该方法的环境去处理。50*第50页,共159页。6.3.1 捕获异常当Java运行时系统得到一个异常对象时,它将会沿着方法的调用栈逐层
33、回溯,寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。这是积极的异常处理机制。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。 51*第51页,共159页。捕获异常是通过try-catch-finally语句实现的。处理异常的程序结构如下:try /接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理catch(要处理的异常种类和标识符) /处理异常catch(要处理的异常种类和标识符) /处理异常finally /最终处理52*第52页
34、,共159页。try-catch-finally语句1. try捕获异常的第一步是用try选定捕获异常的范围,所有可能抛出异常的语句都放入try模块中。try模块中的语句是程序正常流程要执行的语句,但是在执行过程中有可能出现异常。2. catch(必有)每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件。catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块。53*第53页,共159页。try-catch-finally语句在catch块中是对异常对象进行处
35、理的代码,与访问其它对象一样,可以访问一个异常对象的变量或调用它的方法。getMessage( )是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。例如:54*第54页,共159页。try-catch-finally语句try.catch( FileNotFoundException e )System.out.println( message: +e.getMessage() );e.printStackTrace( System.out );catch( IOExcept
36、ion e )System.out.println(e.getMessage() );55*第55页,共159页。try-catch-finally语句catch 语句的顺序:捕获异常的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。56*第56页,共159页。try-catch-finally语句3.finally(可选)捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的
37、状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。Case:例6.1 TryCatchSequence.java57*第57页,共159页。6.3.2 声明抛出异常1. 抛出异常在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛弃(throw)异常。 2. 声明抛弃异常如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃(throws)异常。这是一种消极的异常处理机制。58*第58页,共159页。1. 抛出异常抛出异常就是产生异常对象的过程,首
38、先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出异常对象是通过throw语句实现的。例如:IOException e=new IOException();throw e ;可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:throw new String(want to throw);59*第59页,共159页。在同一个方法中抛出异常和处理异常。Case:例6.2 SeqStack.java60*第60页,共159页。2. 声明抛出异常如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一
39、异常事件进行处理,这时,一个方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。也就是说抛出异常的方法和处理异常的方法不是同一个方法时,则需声明抛出异常。用方法声明中的throws子句指明。例如:public int read () throws IOException.61*第61页,共159页。throws子句中同时可以指明多个异常,之间由逗号隔开。例如: public static void main(String args) throws IOException, IndexOutOfBoundsException Case: 例6.3 SeqStac
40、k2.java62*第62页,共159页。对异常处理的进一步讨论:(1)对Error类或其子类的对象,程序中不必进行处理。(2)对RuntimeException类或其子类,程序中可以不必进行处理。(3)除此之外的异常,程序员都应该在程序中进行处理。 要么用try-catch-finally进行捕获处理 要么明确表示不处理从而声明抛出异常 要么先捕获处理然后再次抛出。(4)Java的异常处理机制(try-catch-finally语句、throws 子句、throw 语句)带来Java程序代码结构上的改变。(5)不能滥用异常机制。简单的出错判断建议用if语句。(6)不要过分细分异常。63*第6
41、3页,共159页。作业编写复数类程序,1选做)增加定义复数类的复数除方法,用throws声明抛出DividedByZeroException(自定义异常); 在合适的位置处理这些异常。2选做)主类中使用args命令行参数传入两个复数操作数,并编程自定义异常LessParamException与NoOperandException;64*第64页,共159页。第7讲 图形用户界面第65页,共159页。主要内容7.1 Java GUI概述Swing组件Swing容器(重点:JFrame类)7.2 图形与绘图7.3 事件处理与Swing常用组件Java事件处理机制常用组件7.4 布局管理器66*第6
42、6页,共159页。7.1 Java GUI概述7.1.1 AWT与Swingjava.awt包中包含了一个完整的类集以支持GUI程序的设计,其中的类及相互关系可以用下图来描述:事件类字体类GraphicsComponent颜色类布局管理类java.lang.ObjectCheckboxContainerButtonWindowPanelAppletDialogFrameList图象类菜单类Scrollpane67*第67页,共159页。Swing组件在javax.swing包中,定义了两种类型的组件:顶层容器(JFrame,JApplet,JDialog和JWindow)和轻量级组件(JCom
43、ponent)。Swing组件都是AWT的Container类的直接子类和间接子类。Swing组件以J开头,除了有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,还增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。68*第68页,共159页。AWT与Swing顶层窗口类之间的关系69*第69页,共159页。7.1.2 Swing组件70*第70页,共159页。7.1.3 容器(Container)容器(Container)也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组
44、件的所有性质,但是它的主要功能是容纳其它组件和容器。1)容器可以简化图形化界面的设计,以整体结构来布置界面。2)所有的容器都可以通过add()方法向容器中添加组件。(参看API)71*第71页,共159页。JFrame JDialog JApplet JWindowJLayeredPaneJRootPaneJContentPaneJGlassPaneJMenuBarSwing容器层次结构72*第72页,共159页。容器分类顶层容器窗体JFrame; JWindow; JApplet;对话框JDialog(JOptionPane)中间层容器面板JPanel; 滚动窗格JScrollPane, J
45、ScrollBar; 拆分窗格JSplitPane; 索查标签窗格JTabbedPane特殊容器内部窗体JInternalFrame; 分层窗格JLayeredPane; 根窗格JRootPane73*第73页,共159页。1. JFrame窗口是最基本的用户界面元素。框架窗口是一种窗体,其中带有边框、标题栏及用于关闭和最大/最小化窗口的图标等。在GUI的应用程序中,一般至少应使用一个框架窗口。通常将框架窗口简称为窗口。JFrame构造方法主要有:JFrame(),建立一个无标题的JFrame。JFrame(String title),建立一个标题为title的JFrame。 74*第74页,
46、共159页。窗口的基本操作 (1) 创建窗口直接生成一个JFrame类的实例即可建立一个窗口,或通过继承JFrame类来定义子类,再建立窗口。例如,创建一个无标题的窗口,语句如下:JFrame frame=new JFrame();(2) 设置标题通过super(String title)调用基类的构造方法,或通过setTitle(String title)方法来设置标题。例如:JFrame frame=new JFrame(“窗口示例”);或者:JFrame myFrame=new JFrame();myFrame.setTitle(“窗口示例”);75*第75页,共159页。(3) 设置初
47、始位置通过setLocation(int x,int y)方法设置初始位置。其中x,y是窗口左上角在屏幕上的坐标值。(4) 设置大小通过setSize(int width,int height)方法设置初始大小。 (5) 设置图标通过setIconImage(Icon icon)方法设置窗口图标。 76*第76页,共159页。(6) 定义关闭行为通过setDefaultCloseOperation(int operation)方法设置关闭行为。其中operation的取值可以是以下几种:DO_NOTHING_ON_CLOSE:当窗口关闭时,不做任何处理;HIDE_ON_CLOSE:当窗口关闭时
48、,隐藏这个窗口;DISPOSE_ON_CLOSE:当窗口关闭时,隐藏并处理这个窗口;EXIT_ON_CLOSE:当窗口关闭时,退出程序。默认是HIDE_ON_CLOSE。 77*第77页,共159页。(7) 添加组件创建好JFrame之后,就可以向它的内容面板中添加组件。对JFrame添加组件有两种方式:用getContentPane( )方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childComponent)建立一个JPanel或 JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该
49、容器置为JFrame的内容面板:JPanel conPane=new JPanel();/把其它组件添加到JPanel中;frame.setContentPane(conPane); /把conPane对象设置成为frame的内容面板 78*第78页,共159页。【例7.1】 建立一个标题为“Swing窗口”,大小为(300,200),图标为javalogo.gif,位置居中的窗口。屏幕效果如图7.4所示。79*第79页,共159页。2. 无边框的窗口JWindowJWindow可以构造无边框的窗口。主要构造方法有:JWindow():创建一个无边界的窗口;JWindow(Frame owne
50、r):创建一个依赖Frame对象的窗口。3对话框JDialog 对话框与框架窗口类似,是有边框、有标题、可独立存在的顶级容器。对话框分为无模态对话框和模态对话框。JDialog的构造方法有:JDialog(Frame owner);JDialog(Frame owner,Boolean modal);JDialog(Frame owner,String title);JDialog(Frame owner,String title,Boolean modal);80*第80页,共159页。4面板JPanelSwing的JPanel,它替代了AWT的画布(Canvas)和面板(Panel),兼有
51、二者的功能。JPanel是一个非顶级的通用容器,总是处于其它一些容器中。JPanel不能象JFrame那样能够在桌面上浮动。利用JPanel可以使版面的排列方式更生动,对于复杂GUI,通常由多个面板组成,而每个面板以特定的布局来排列组件。JPanel的构造方法有:JPanel();JPanel(boolean isDoubleBuffered);JPanel(LayoutManager layout);JPanel(LayoutManager layout,boolean isDoubleBuffered);81*第81页,共159页。5. 分割面板JSplitPaneJSplitPane一次
52、可将两个组件同时显示在两个显示区中,若想要同时在多个显示区显示组件,便必须同时使用多个JSplitPane。JSplitPane提供两个常数:HORIZONTAL_SPLIT、VERTICAL_SPLIT,用来设置水平分割或是垂直分割。6. JTabbedPane如果一个窗口的功能有几项,可以给每项设置一个标签,每个标签下面包含为完成此功能专用的若干组件。用户要使用哪项功能,只要单击相应的标签,就可以进入相应的页面。这种选项卡功能的实现就需要使用JTabbedPane这个中间层容器。82*第82页,共159页。7. 滚动面板JScrollPane当容器内要容纳的内容大于容器时,希望容器能够有一
53、个滚动条,通过拖动滑块,就可以看到更多的内容。JScrollPane就是能够实现这种功能的容器。8. JInternalFrame使用JInternalFrame容器类可以实现在一个主窗口中打开很多个文档,每个文档各自占用一个新的窗口。JInternalFrame的使用跟JFrame几乎一样,可以最大化、最小化、关闭窗口、加入菜单;唯一不同的是JInternalFrame是轻量级组件,它只能是中间容器,必须依附于顶层容器上。83*第83页,共159页。7.1.4 基于Swing的Java GUI设计思路基本的java程序的GUI设计工具。主要包括下述几个概念:组件Component (API)
54、 容器-Container布局管理器LayoutManager事件处理 在Java中,开发一个GUI程序,通常需要以下几步:(1) 构建一个顶层容器;通常是JFrame或JApplet (2)构建若干个组件,组件可以是其它容器; (3)设定容器的布局管理器;用容器的add方法将这些组件加入到这个容器中;(4) 设置组件事件;并将组件事件与代码关联。84*第84页,共159页。7.2 图形与绘图7.2.1 绘图表面为了在Java程序里进行绘图和绘画,需要有一个可以操作的表面。在抽象窗口工具包(AWT)中,这个绘图表面通常是一个Canvas组件。在Swing程序中可以直接在顶层窗口(通常是JApp
55、let和JFrame)上绘图,或者在JPanel的子类上绘图。7.2.2 图形环境和图形对象GUI组件(诸如applet或窗口)的左上角坐标默认为(0,0),坐标对由一个x坐标(水平坐标)和一个y坐标(垂直坐标)组成。x坐标是从左上角向右移动的水平距离,y坐标是从左上角向下移动的垂直距离。(如图示)85*第85页,共159页。86*第86页,共159页。在屏幕上绘图要使用Java图形环境,每个Java组件(包括Swing组件),都有一个与之关联的图形环境,也称图形上下文,用java.awt.Graphics类的一个对象来表示。Graphics对象用于管理图形环境,并在屏幕上绘制代表文本或其它图
56、形对象(如线条、椭圆、矩形或其它多边形)的像素。Graphics 类是所有图形上下文的抽象基类,这个上下文允许应用程序将图形绘制到由不同设备实现的组件上,以及绘制到空闲屏幕的映像中。 87*第87页,共159页。一个 Graphics 对象封装有 Java 所支持的基本绘图操作所需的状态信息。此状态信息包括下列属性: 要被绘制到其上的组件对象; 绘制和剪贴坐标的平移原点。; 当前的剪贴区; 当前颜色; 当前的字体; 当前的逻辑像素操作函数 (XOR 或 Paint) ; 88*第88页,共159页。图形图像处理类Graphics类常用方法1)画线g.drawLine(xcenter, ycen
57、ter, xs, ys);2)画圆 g.drawArc(xcenter - 50, ycenter - 50, 100, 100, 0, 360);89*第89页,共159页。3)绘制字符串 g.drawString(lastdate, 5, 125)4)设置字体g.setFont(clockFaceFont);Font clockFaceFont = new Font(Serif, Font.PLAIN, 14);5)设置颜色 g.setColor(handColor);Color handColor = Color.blue;90*第90页,共159页。7.2.3 颜色Color类java
58、.awt.Color类定义了颜色常量和方法。每种颜色都是从RGB值创建出来的。public Color(int r,int g,int b);预定义了13个颜色常量。见表7.4Color类的常用方法见表7.591*第91页,共159页。7.2.4 字体java.awt.Font类:字体是从字形创建的,一个字形是一个位映射图像,它定义字体中的字符和符号的外观。Font clockFaceFont = new Font(Serif, Font.PLAIN, 14);Font类的构造函数有3个参数:字体名称、字体风格和字体大小。1)字体名称可以是运行程序的当前系统所支持的任何字体,在Java1.1和
59、以后的版本中,所支持的字体名字有Monospaced、SansSerif、Serif、Dialog和DialogInput。 92*第92页,共159页。java.awt.Font类:2)字体风格public final static int PLAIN一个代表普通字体风格的常量public final static int BOLD一个代表粗体字体风格的常量public final static int ITALIC一个代表斜体字体风格的常量也可以是BOLD与ITALIC的结合93*第93页,共159页。7.2.5 使用Graphics类绘图当在AWT组件和Swing顶层窗口(JApplet
60、和JFrame,是java.awt.Component的子类)上绘图时,需要重写组件的paint()方法;当在Swing的JComponent的子类组件上绘图时,则需重写paintComponent()方法。在这两种情况(Swing和AWT)下,都是以一个Graphics对象作为参数。在某个组件需要进行绘图操作时,系统会将Graphics对象传递给paint方法或paintComponent方法。paint方法和paintComponent方法的头部分别为:public void paint(Graphics g )public void paintComponent(Graphics g )
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 秋季学期课程安排与目标计划
- 团队建设的工作计划设计
- 财务团队建设计划
- 急诊与社区医疗协作模式计划
- 学生国际交流经历的收获与反思
- 跨文化交流与合作的心得计划
- 学生人际关系与心理健康的关系研究
- 2024年图书管理员考试学习心得试题及答案
- 2024年语文经典文化传承试题及答案
- 在线教育资源的有效利用与整合
- 2025年中考英语时文阅读:6篇有关电影哪吒2的英语阅读及相关题目(无答案)
- 生物信息学第三讲基因功能富集分析
- 中职高教版(2023)语文职业模块-第五单元:走近大国工匠(二)学习工匠事迹 领略工匠风采【课件】
- 2024年山东省济南市中考地理试题卷(含答案解析)
- 2024年太原城市职业技术学院高职单招数学历年参考题库含答案解析
- DB31∕T 795-2014 综合建筑合理用能指南
- GB/T 44979-2024智慧城市基础设施紧凑型城市智慧交通
- 戏剧课程设计方案
- 2025年保密知识试题库附参考答案(精练)
- 物料提升机安全技术操作规程(4篇)
- 临床微生物学检验技术知到智慧树章节测试课后答案2024年秋济宁医学院
评论
0/150
提交评论