楼主: lastwinner

[转载] JAVA应用程序设计开发

[复制链接]
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
31#
 楼主| 发表于 2006-6-27 23:59 | 只看该作者
8.3 日历类Calendar
  在早期的JDK版本中,日期(Date)类附有两大功能:(1)允许用年、月、日、时、分、秒来解释日期:(2)允许对表示日期的字符串进行格式化各句法分析。在JDK1.1中提供了类Calendar来完成第一种功能,类DateFormat来完成第二项功能。dateFormat是java.text包中的一个类。与Date类有所不同的是,DateFromat类接受用各种语言和不同习惯表示的日期字符串。本节将介绍java.util包中的类Calendar及其它新增加的相关的类。
  类Calendar是一个抽象类,它完成日期(Date)类和普通日期表示法(即用一组整型域如YEAR,MONTH,DAY,HOUR表示日期)之间的转换。
  由于所使用的规则不同,不同的日历系统对同一个日期的解释有所不同。在JDK2.2中提供了Calendar类一个子类GregorianCalendar——它实现了世界上普遍使用的公历系统。当然用户也可以通过继承Calendar类,并增加所需规则,以实现不同的日历系统。
  第GregorianCalendar继承了Calendar类。本节将在介绍类GregorianCalendar的同时顺带介绍Calendar类中的相关方法。
  类GregorianCalendar提供了七种构造函数:
  (1)public GregorianCalendar()
  创建的对象中的相关值被设置居指定时区,缺省地点的当前时间,即程序运行时所处的时区、地点的当前时间。
  (2)public GregorianCalendar(TimeZone zone)
  创建的对象中的相关值被设置成指定时区zone,缺省地点的当前时间。
  (3)public GregorianCalendar(Locale aLocale)
  创建的对象中的相关值被设置成缺省时区,指定地点aLocale的当前时间。
  (4)public GregorianCalendar(TimeZone zone,Local aLocale)
  创建的对象中的相关值被设置成指定时区,指定地点的当前时间。
  上面使用到的类TimeZone的性质如下:
  TimeZone是java.util包中的一个类,其中封装了有关时区的信息。每一个时区对应一组ID。类TimeZone提供了一些方法完成时区与对应ID两者之间的转换。,可以调用方法 ()()()
  (Ⅰ)已知某个特定的ID,可以调用方法
  public static synchronized TimeZone getTimeZone(String ID)
来获取对应的时区对象。
  例 太平洋时区的ID为PST,用下面的方法可获取对应于太平洋时区的时区对象:
  TimeZone tz=TimeZone.getTimeZone("PST";
  调用方法getDefault()可以获取主机所处时区的对象。
  TimeZone tz=TimeZone.getDefault();
  (Ⅱ)调用以下方法可以获取时区的ID
  ■public static synchronized String[] getavailableIDs(int rawOffset)
  根据给定时区偏移值获取ID数组。同一时区的不同地区的ID可能不同,这是由于不同地区对是否实施夏进制意见不统一而造成的。
  例String s[]=TimeZone.getAvailableIDs(-7*60*60*1000);
  打印s,结果为s[0]=PNT,s[1]=MST
  ■public static synchronized String[] getAvailableIDs()
  获取提供的所有支持的ID。
  ■public String getID()
  获取特定时区对象的ID。
  例 TimeZone tz=TimeZone.getDefault();
  String s=tz.getID();
  打印s,结果为s=CTT。
  上面使用类的对象代表了一个特定的地理、政治或文化区域。Locale只是一种机制,它用来标识一类对象,Local本身并不包含此类对象。
  要获取一个Locale的对象有两种方法:
  (Ⅰ)调用Locale类的构造方法
  Locale(String language,String country)
  Locale(String language,String country,String variant)
  参数说明:language——在ISO-639中定义的代码,由两个小写字母组成。
       country——在ISO-3166中定义的代码,由两个大写字母组成。
       variant——售货商以及特定浏览器的代码,例如使用WIN代表Windows。
  (Ⅱ)调用Locale类中定义的常量
  Local类提供了大量的常量供用户创建Locale对象。
  例 Locale.CHINA
    为中国创建一个Locale的对象。
  类TimeZone和类Locale中的其它方法,读者可查阅API。
  (5)public GregorianCalendar(int year,int month,int date)
  (6)public GregorianCalendar(int year,int month,int date,int hour,int minute)
  (7)public GregorianCalendar(int year,int month,int date,int hour,int minute,int second)
  用给定的日期和时间创建一个GregorianCalendar的对象。
  参数说明:
  year-设定日历对象的变量YEAR;month-设定日历对象的变量MONTH;
  date-设定日历对象的变量DATE;hour-设定日历对象的变量HOUR_OF_DAY;
  minute-设定日历对象的变量MINUTE;second-设定日历对象的变量SECOND。
  与Date类中不同的是year的值没有1900这个下限,而且year的值代表实际的年份。month的含义与Date类相同,0代表1月,11代表12月。
  例 GregorianCalendar cal=new GregorianCalendar(1991,2,4)
  cal的日期为1991年3月4号。
  除了与Date中类似的方法外,Calendar类还提供了有关方法对日历进行滚动计算和数学计算。计算规则由给定的日历系统决定。进行日期计算时,有时会遇到信息不足或信息不实等特殊情况。Calendar采取了相应的方法解决这些问题。当信息不足时将采用缺省设置,在GregorianCalendar类中缺省设置一般为YEAR=1970,MONTH=JANUARY,DATE=1。
  当信息不实时,Calendar将按下面的次序优先选择相应的Calendar的变量组合,并将其它有冲突的信息丢弃。
  MONTH+DAY_OF_MONTH
  MONTH+WEEK_OF_MONTH+DAY_OF_WEEK
  MONTH+DAY_OF_WEEK_OF_MONTH+DAY_OF_WEEK
  DAY_OF+YEAR
  DAY_OF_WEEK_WEEK_OF_YEAR
  HOUR_OF_DAY

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
32#
 楼主| 发表于 2006-6-28 00:00 | 只看该作者
8.4 随机数类Random
  Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法。它可以产生int、long、float、double以及Goussian等类型的随机数。这也是它与java.lang.Math中的方法Random()最大的不同之处,后者只产生double型的随机数。
  类Random中的方法十分简单,它只有两个构造方法和六个普通方法。
  构造方法:
  (1)public Random()
  (2)public Random(long seed)
  Java产生随机数需要有一个基值seed,在第一种方法中基值缺省,则将系统时间作为seed。
  普通方法:
  (1)public synonronized void setSeed(long seed)
  该方法是设定基值seed。
  (2)public int nextInt()
  该方法是产生一个整型随机数。
  (3)public long nextLong()
  该方法是产生一个long型随机数。
  (4)public float nextFloat()
  该方法是产生一个Float型随机数。
  (5)public double nextDouble()
  该方法是产生一个Double型随机数。
  (6)public synchronized double nextGoussian()
  该方法是产生一个double型的Goussian随机数。
  例8.2 RandomApp.java。
  //import java.lang.*;
  import java.util.Random;

  public class RandomApp{
   public static void main(String args[]){
    Random ran1=new Random();
    Random ran2=new Random(12345);
    //创建了两个类Random的对象。
    System.out.println("The 1st set of random numbers:";
    System.out.println("\t Integer:"+ran1.nextInt());
    System.out.println("\t Long:"+ran1.nextLong());
    System.out.println("\t Float:"+ran1.nextFloat());
    System.out.println("\t Double:"+ran1.nextDouble());
    System.out.println("\t Gaussian:"+ran1.nextGaussian());
    //产生各种类型的随机数
    System.out.print("The 2nd set of random numbers:";
    for(int i=0;i<5;i++){
     System.out.println(ran2.nextInt()+" ";
     if(i==2) System.out.println();
     //产生同种类型的不同的随机数。
     System.out.println();//原文如此
    }
   }
  }

  运行结果:
  E:\java01>java RandomApp
  The 1st set of random numbers:
    Integer:-173899656
    Long:8056223819738127077
    Float:0.6293638
    Double:0.7888394520265607
    Gaussian:0.5015701094568733
  The 2nd set of random numbers:1553932502
  -2090749135
  -287790814
  -355989640
  -716867186
  E:\java01>

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
33#
 楼主| 发表于 2006-6-28 04:10 | 只看该作者
8.5 向量类Vector
  Java.util.Vector提供了向量(Vector)类以实现类似动态数组的功能。在Java语言中。正如在一开始就提到过,是没有指针概念的,但如果能正确灵活地使用指针又确实可以大大提高程序的质量,比如在C、C++中所谓“动态数组”一般都由指针来实现。为了弥补这点缺陷,Java提供了丰富的类库来方便编程者使用,Vector类便是其中之一。事实上,灵活使用数组也可完成向量类的功能,但向量类中提供的大量方法大大方便了用户的使用。
  创建了一个向量类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型也不需预先选定向量的容量,并可方便地进行查找。对于预先不知或不愿预先定义数组大小,并需频繁进行查找、插入和删除工作的情况,可以考虑使用向量类。
  向量类提供了三种构造方法:
  public vector()
  public vector(int initialcapacity,int capacityIncrement)
  public vector(int initialcapacity)
  使用第一种方法,系统会自动对向量对象进行管理。若使用后两种方法,则系统将根据参数initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时,系统会扩充向量对象的存储容量。参数capacityIncrement给定了每次扩充的扩充值。当capacityIncrement为0时,则每次扩充一倍。利用这个功能可以优化存储。
  在Vector类中提供了各种方法方便用户使用:
  ■插入功能
  (1)public final synchronized void addElement(Object obj)
  将obj插入向量的尾部。obj可以是任何类的对象。对同一个向量对象,可在其中插入不同类的对象。但插入的应是对象而不是数值,所以插入数值时要注意将数值转换成相应的对象。
  例 要插入一个整数1时,不要直接调用v1.addElement(1),正确的方法为:
  Vector v1=new Vector();
  Integer integer1=new Integer(1);
  v1.addElement(integer1);
  (2)public final synchronized void setElementAt(object obj,int index)
  将index处的对象设成obj,原来的对象将被覆盖。
  (3)public final synchronized void insertElementAt(Object obj,int index)
  在index指定的位置插入obj,原来对象以及此后的对象依次往后顺延。
  ■删除功能
  (1)public final synchronized void removeElement(Object obj)
  从向量中删除obj。若有多个存在,则从向量头开始试,删除找到的第一个与obj相同的向量成员。
  (2)public final synchronized void removeAllElement()
  删除向量中所有的对象。
  (3)public final synchronized void removeElementlAt(int index)
  删除index所指的地方的对象。
  ■查询搜索功能
  (1)public final int indexOf(Object obj)
  从向量头开始搜索obj ,返回所遇到的第一个obj对应的下标,若不存在此obj,返回-1。
  (2)public final synchronized int indexOf(Object obj,int index)
  从index所表示的下标处开始搜索obj。
  (3)public final int lastIndexOf(Object obj)
  从向量尾部开始逆向搜索obj。
  (4)public final synchronized int lastIndexOf(Object obj,int index)
  从index所表示的下标处由尾至头逆向搜索obj。
  (5)public final synchronized Object firstElement()
  获取向量对象中的首个obj。
  (6)public final synchronized Object lastelement()
  获取向量对象中的最后一个obj。
  了解了向量的最基本的方法后,我们来看一下例8.3VectorApp.java。
  例8.3 VectorApp.java。
  import java.util.Vector;
  import java.lang.*;//这一句不应该要,但原文如此
  import java.util.Enumeration;
  public class VectorApp{
   public static void main(String[] args){
    Vector v1=new Vector();
    Integer integer1=new Integer(1);
    v1.addElement("one";
    //加入的为字符串对象
    v1.addElement(integer1);
    v1.addElement(integer1);
    //加入的为Integer的对象
    v1.addElement("two";
    v1.addElement(new Integer(2));
    v1.addElement(integer1);
    v1.addElement(integer1);
    System.out.println("The vector v1 is:\n\t"+v1);
    //将v1转换成字符串并打印
    v1.insertElementAt("three",2);
    v1.insertElementAt(new Float(3.9),3);
    System.out.println("The vector v1(used method insertElementAt()) is:\n\t "+v1);
    //往指定位置插入新的对象,指定位置后的对象依次往后顺延
    v1.setElementAt("four",2);
    System.out.println("The vector v1(used method setElementAt()) is:\n\t "+v1);
    //将指定位置的对象设置为新的对象
    v1.removeElement(integer1);
    //从向量对象v1中删除对象integer1由于存在多个integer1所以从头开始
    //找,删除找到的第一个integer1
    Enumeration enum=v1.elements();
    System.out.print("The vector v1(used method removeElement())is:";
    while(enum.hasMoreElements())
    System.out.print(enum.nextElement()+" ";
    System.out.println();
    //使用枚举类(Enumeration)的方法来获取向量对象的每个元素
    System.out.println("The position of object 1(top-to-bottom):"
     + v1.indexOf(integer1));
    System.out.println("The position of object 1(tottom-to-top):"
     +v1.lastIndexOf(integer1));
    //按不同的方向查找对象integer1所处的位置
    v1.setSize(4);
    System.out.println("The new vector(resized the vector)is:"+v1);
    //重新设置v1的大小,多余的元素被行弃
   }
  }
  运行结果:
  E:\java01>java VectorApp
  The vector v1 is:
     [one, 1, 1, two, 2, 1, 1]
  The vector v1(used method insertElementAt()) is:
     [one, 1, three, 3.9, 1, two, 2, 1, 1]
  The vector v1(used method setElementAt()) is:
     [one, 1, four, 3.9, 1, two, 2, 1, 1]
  The vector v1(used method removeElement())isne four 3.9 1 two 2 1 1
  The position of object 1(top-to-bottom):3
  The position of object 1(tottom-to-top):7
  The new vector(resized the vector)is:[one, four, 3.9, 1]
  E:\java01>
  从例8.3运行的结果中可以清楚地了解上面各种方法的作用,另外还有几点需解释。
  (1)类Vector定义了方法
  public final int size()
  此方法用于获取向量元素的个数。它的返回值是向是中实际存在的元素个数,而非向量容量。可以调用方法capactly()来获取容量值。
  方法:
  public final synchronized void setsize(int newsize)
  此方法用来定义向量大小。若向量对象现有成员个数已超过了newsize的值,则超过部分的多余元素会丢失。
  (2)程序中定义了Enumeration类的一个对象
  Enumeration是java.util中的一个接口类,在Enumeration中封装了有关枚举数据集合的方法。
  在Enumeration中提供了方法hawMoreElement()来判断集合中是束还有其它元素和方法nextElement()来获取下一个元素。利用这两个方法可以依次获得集合中元素。
  Vector中提供方法:
  public final synchronized Enumeration elements()
  此方法将向量对象对应到一个枚举类型。java.util包中的其它类中也大都有这类方法,以便于用户获取对应的枚举类型。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
34#
 楼主| 发表于 2006-6-28 04:12 | 只看该作者
8.6 栈类Stack
  Stack类是Vector类的子类。它向用户提供了堆栈这种高级的数据结构。栈的基本特性就是先进后出。即先放入栈中的元素将后被推出。Stack类中提供了相应方法完成栈的有关操作。
  基本方法:
  public Object push(Object Hem)
  将Hem压入栈中,Hem可以是任何类的对象。
  public Object pop()
  弹出一个对象。
  public Object peek()
  返回栈顶元素,但不弹出此元素。
  public int search(Object obj)
  搜索对象obj,返回它所处的位置。
  public boolean empty()
  判别栈是否为空。
  例8.4 StackApp.java使用了上面的各种方法。
  例8.4 StackApp.java。
  import java.lang.*;
  import java.util.*;
  public class StackApp{
   public static void main(String args[]){
    Stack sta=new Stack();
    sta.push("Apple";
    sta.push("banana";
    sta.push("Cherry";
    //压入的为字符串对象
    sta.push(new Integer(2));
    //压入的为Integer的对象,值为2
    sta.push(new Float(3.5));
    //压入的为Float的对象,值为3.5
    System.out.println("The stack is,"+sta);
    //对应栈sta
    System.out.println("The top of stack is:"+sta.peek());
    //对应栈顶元素,但不将此元素弹出
    System.out.println("The position of object Cherry is:"
    +sta.search("cherry");
    //打印对象Cherry所处的位置
    System.out.print("Pop the element of the stack:";
    while(!sta.empty())
    System.out.print(sta.pop()+" ";
    System.out.println();
    //将栈中的元素依次弹出并打印。与第一次打印的sta的结果比较,可看出栈
    //先进后出的特点
   }
  }
  运行结果(略)

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
35#
 楼主| 发表于 2006-6-28 04:12 | 只看该作者
8.7 哈希表类Hashtable
  哈希表是一种重要的存储方式,也是一种常见的检索方法。其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。检索时采用检索关键码的方法。现在哈希表有一套完整的算法来进行插入、删除和解决冲突。在Java中哈希表用于存储对象,实现快速检索。
  Java.util.Hashtable提供了种方法让用户使用哈希表,而不需要考虑其哈希表真正如何工作。
  哈希表类中提供了三种构造方法,分别是:
  public Hashtable()
  public Hashtable(int initialcapacity)
  public Hashtable(int initialCapacity,float loadFactor)
  参数initialCapacity是Hashtable的初始容量,它的值应大于0。loadFactor又称装载因子,是一个0.0到0.1之间的float型的浮点数。它是一个百分比,表明了哈希表何时需要扩充,例如,有一哈希表,容量为100,而装载因子为0.9,那么当哈希表90%的容量已被使用时,此哈希表会自动扩充成一个更大的哈希表。如果用户不赋这些参数,系统会自动进行处理,而不需要用户操心。
  Hashtable提供了基本的插入、检索等方法。
  ■插入
  public synchronized void put(Object key,Object value)
给对象value设定一关键字key,并将其加到Hashtable中。若此关键字已经存在,则将此关键字对应的旧对象更新为新的对象Value。这表明在哈希表中相同的关键字不可能对应不同的对象(从哈希表的基本思想来看,这也是显而易见的)。
  ■检索
  public synchronized Object get(Object key)
  根据给定关键字key获取相对应的对象。
  public synchronized boolean containsKey(Object key)
  判断哈希表中是否包含关键字key。
  public synchronized boolean contains(Object value)
  判断value是否是哈希表中的一个元素。
  ■删除
  public synchronized object remove(object key)
  从哈希表中删除关键字key所对应的对象。
  public synchronized void clear()
  清除哈希表
  另外,Hashtalbe还提供方法获取相对应的枚举集合:
  public synchronized Enumeration keys()
  返回关键字对应的枚举对象。
  public synchronized Enumeration elements()
  返回元素对应的枚举对象。
  例8.5 Hashtable.java给出了使用Hashtable的例子。
  例8.5 Hashtalbe.java。
  //import java.lang.*;
  import java.util.Hashtable;
  import java.util.Enumeration;
  public class HashApp{
   public static void main(String args[]){
    Hashtable hash=new Hashtable(2,(float)0.8);
    //创建了一个哈希表的对象hash,初始容量为2,装载因子为0.8

    hash.put("Jiangsu","Nanjing";
    //将字符串对象“Jiangsu”给定一关键字“Nanjing”,并将它加入hash
    hash.put("Beijing","Beijing";
    hash.put("Zhejiang","Hangzhou";

    System.out.println("The hashtable hash1 is: "+hash);
    System.out.println("The size of this hash table is "+hash.size());
    //打印hash的内容和大小

    Enumeration enum1=hash.elements();
    System.out.print("The element of hash is: ";
    while(enum1.hasMoreElements())
     System.out.print(enum1.nextElement()+" ";
    System.out.println();
    //依次打印hash中的内容
    if(hash.containsKey("Jiangsu")
     System.out.println("The capatial of Jiangsu is "+hash.get("Jiangsu");
    hash.remove("Beijing";
    //删除关键字Beijing对应对象
    System.out.println("The hashtable hash2 is: "+hash);
    System.out.println("The size of this hash table is "+hash.size());
   }
  }

  运行结果:
  The hashtable hash1 is: {Beijing=Beijing, Zhejiang=Hangzhou, Jiangsu=Nanjing}
  The size of this hash table is 3
  The element of hash is: Beijing Hangzhou Nanjing
  The capatial of Jiangsu is Nanjing
  The hashtable hash2 is: {Zhejiang=Hangzhou, Jiangsu=Nanjing}
  The size of this hash table is 2

  Hashtable是Dictionary(字典)类的子类。在字典类中就把关键字对应到数据值。字典类是一个抽象类。在java.util中还有一个类Properties,它是Hashtable的子类。用它可以进行与对象属性相关的操作。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
36#
 楼主| 发表于 2006-6-28 04:20 | 只看该作者
8.8 位集合类BitSet
  位集合类中封装了有关一组二进制数据的操作。
  我们先来看一下例8.6 BitSetApp.java。
  例8.6 BitSetApp.java
  //import java.lang.*;
  import java.util.BitSet;
  public class BitSetApp{
   private static int n=5;
   public static void main(String[] args){
    BitSet set1=new BitSet(n);
    for(int i=0;i<n;i++) set1.set(i);
    //将set1的各位赋1,即各位均为true
    BitSet set2= new BitSet();
    set2=(BitSet)set1.clone();
    //set2为set1的拷贝
    set1.clear(0);
    set2.clear(2);
    //将set1的第0位set2的第2位清零
    System.out.println("The set1 is: "+set1);
    //直接将set1转换成字符串输出,输出的内容是set1中值true所处的位置
    //打印结果为The set1 is:{1,2,3,4}
    System.out.println("The hash code of set2 is: "+set2.hashCode());
    //打印set2的hashCode
    printbit("set1",set1);
    printbit("set2",set2);
    //调用打印程序printbit(),打印对象中的每一个元素
    //打印set1的结果为The bit set1 is: false true true true true
    set1.and(set2);
    printbit("set1 and set2",set1);
    //完成set1 and set2,并打印结果
    set1.or(set2);
    printbit("set1 or set2",set1);
    //完成set1 or set2,并打印结果
    set1.xor(set2);
    printbit("set1 xor set2",set1);
    //完成set1 xor set2,并打印结果
   }
   //打印BitSet对象中的内容
   public static void printbit(String name,BitSet set){
    System.out.print("The bit "+name+" is: ";
    for(int i=0;i<n;i++)
     System.out.print(set.get(i)+" ";
    System.out.println();
   }
  }

  运行结果:
  The set1 is: {1, 2, 3, 4}
  The hash code of set2 is: 1225
  The bit set1 is: false true true true true
  The bit set2 is: true true false true true
  The bit set1 and set2 is: false true false true true
  The bit set1 or set2 is: true true false true true
  The bit set1 xor set2 is: false false false false false

  程序中使用了BitSet类提供的两种构造方法:
    public BitSet();
    public BitSet(int n);
  参数n代表所创建的BitSet类的对象的大小。BitSet类的对象的大小在必要时会由系统自动扩充。
  其它方法:
  public void set(int n)
  将BitSet对象的第n位设置成1。
  public void clear(int n)
  将BitSet对象的第n位清零。
  public boolean get(int n)
  读取位集合对象的第n位的值,它获取的是一个布尔值。当第n位为1时,返回true;第n位为0时,返回false。
  另外,如在程序中所示,当把一BitSet类的对象转换成字符串输出时,输出的内容是此对象中true所处的位置。
  在BitSet中提供了一组位操作,分别是:
  public void and(BitSet set)
  public void or(BitSet set)
  public void xor(BitSet set)
利用它们可以完成两个位集合之间的与、或、异或操作。
  BitSet类中有一方法public int size()来取得位集合的大小,它的返回值与初始化时设定的位集合大小n不一样,一般为64。

小结
  本章我们介绍了Java的实用工具类库java.util中一些常用的类。java.util包中还有其它一些类。它们的具体用法用户可以自行查阅API。在下一章,我们将学习利用java.awt包进行窗口程序设计。在下章的例子中我们将使用到本章介绍的各种类。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
37#
 楼主| 发表于 2006-6-28 04:21 | 只看该作者
第九章 窗口程序设计(1)
  Java的抽象窗口工具包AWT(Abstract Window Toolkit)提供了创建基于窗口的图形用户界面的便利工具。它的内容相当丰富,共有60多个类和接口。利用AWT类库,用户可以方便地建立自己的窗口界面,响应并处理交互事件。

  这一章我们将首先阐述有关窗口编程的基本概念,包括AWT的构成,窗口的布局显示以及交互事件的处理等。然后,我们通过实例介绍几个较为常用和重要的类,如菜单、对话框、滚动条等,最后还将说明如何利用AWT完成Java的动画功能。

9.1 基本概念
  9.1.1 AWT类库的继承层次
  图形窗口形式的用户界面不同于传统的命令行形式的用户界面,它通过“窗口”、“按钮”、“菜单”等可视的灵活方式提供人机交互的手段,更为直观和生动。Java的AWT包定义了窗口系统所显示的各种对象,既包括组织窗口屏幕元素所需的基本类,也包括图形处理,显示所需的基本类。
  Java组织窗口元素是通过“组件”(Component)和“容器”(Container)来进行的,“组件”包括屏幕上的各种组成部件,如按钮、菜单、画布等。“容器”则是一种特殊的组件,用来放置、容纳其它组件或容器,如面板、对话框等。
  用代表组件的最基本的类是Component。它是一个抽象类,封装定义了窗口中各种对象一系列最基本的属性和操作。除了有关菜单的类,其它所有代表窗口对象的类,都是类Component的子孙类,都继承了它的方法和性质。因而类Component的许多方法是程序中经常用的,在表9.1中列出了类Component的主要方法。

表9.1 类Component的主要方法

方 法 名 返回值类型 基本功能
add void 加入弹出式菜单
addComponentListener void 添加组件事件监听器
addFocusListener void 添加焦点事件监听器
addKeyListener void 添加键盘事件监听器
addMouseListener void 添加鼠标事件监听器
addMouseMotionListener void  添加鼠标动作事件监听器
disableEvents void 禁止处理某事件
enableEvents void 允许处理某事件
getBackGround Color 取组件背景色
getComponent Component 取包含某坐标值的组件
getFont Font 取组件字体
getForeGround Color 取组件前景色
getLocation Point 取组件坐标值
getParent Container 取组件父容器
getPeer ComponentPeer 取组件的对等对象
getSize Dimension 取组件大小
getToolkit Toolkit 取组件的工具包
isEnabled boolean 返回组件是否能使用的状态
isShowing boolean 返回组件是否正显示
isVisible boolean 检查组件是否可见
list void 列出组件清单
paint void 利用图形类显示组件
processEvent void 处理发生在组件内的事件
repaint void 重画组件
setBackGround void 设置组件背景色
setFont void 设置组件字体
setForeGround void 设置组件前景色
setLocation void 移动组件
setSize void 改变组件大小
setEnabled void 控制组件是否能被使用
setVisible void 设置组件是否可见

  类Component的子类包括许多我们熟悉且常用的组件对象,如按钮类Button,标签类Label,选择框类Checkbox,画布类Canvas等。
  Component还有一个特殊的子类Container作为最基本的组件容器。所有可作为容 器的窗口对象,都是由类Container或其子孙类生成的对象实体。Container的两个子类是类Window和类Panel。类Window是代表窗口的最基本的类,这又派生出两个子类:类Dialog用以制作对话框;类Frame则用以制作一般窗口。类Panel定义窗口上的子区域,用来分组安排窗口对象,更重要的,Panel是我们在第三章中提及的Java的特有程序类Applet的父类。通过Panel和Applet间的这种继承关系,Applet程序和AWT窗口环境结合在一起。因此正如我们在第三章示例中所见,Applet的外形和布局显示都是与一般窗口相似的,然而类Applet的有关内容是被封装在另一个包java.applet中的,我们将在下一章具体讲述。

  图9.1给出的是Component的主要子类的继承层次图。

           ┌Button按钮
           ├Convas画布     ┌─Dialog对话框
           ├Choice弹出式列表框 ├─Frame基本框
           ├Checkbox选择框  │
           ├List列表框    ┌Window窗口
  Component┼Container容器┤
   组件      ├Label标签    └Panel面板
           ├TextArea多行    │
           ├TextField单行文本 └Applet小应用程序
           └Scrollbar滚动条
      图9.1 Component主要子类继承层次图

  AWT中中有关菜单的类独立于其它类,是从类MenuComponent中派生出来的。它们的继承关系如图9.2所示。

              ┌ MenuBar  ┌Menu普通菜单
              │ 菜单条   │  │
              │       │  └PopupMenu
  object ─ MenuComponent┤       │   弹出式菜单
   对象   菜单组件  └ MenuItem-─┤
                菜单项   └checkboxMenuItem
                        可选菜单项
      图9.2 菜单有关类继承层次图

  AWT中的另一组类是有关图形显示的类,主要有图形类Graphics、字体类Font、颜色类Color和图像类Image。它们都从java.lang.Object类直接派出生来,完成窗口中的各种绘图、字串显示、颜色设置和图像载入功能。我们将在下面各节中结合对主要窗口组件类一起来介绍这些类。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
38#
 楼主| 发表于 2006-6-28 04:23 | 只看该作者
  9.1.2 窗口的布局与显示
  窗口设计程序通常包括以下几方面的内容:
  ■设置基本容器窗口。
  ■设置容器布局。
  ■添加所需组件。
  ■交互事件处理。
  1.基本窗口实例
  我们来考察一个最简单的例子。
  例9.1 WelcomWin.java程序文件
  1:import java.awt.Frame;
  2:import java.awt.Graphics;
  3:import java.awt.enent.*;
  4:
  5:public class WelcomeWin extends Frame{
  6: public static void main(String args[]){//main方法,程序执行起点
  7:  WelcomeWin app=new WelcomeWin();
  8: }
  9: public WelcomeWin(){//类WelcomeWin构造方法
  10:  super("My First Try";
  11:  pack();
  12:  setSize(300,100);
  13:  addWindowListener(new MyAdapter());
  14:  setVisible(true);
  15: }
  16: public void paint(Graphics g){//类WelcomeWin显示方法
  17:  g.drawString("Welcome to Windows Programming!",50,50);
  18: }
  19:}
  20:class MyAdapter extends WindowAdapter{//类MyAdapter处理交互事件
  21: public void windowClosing(WindowEvent e{//窗口关闭事件
  22:  System.exit(0);
  23: }
  24:}
  为了建立一个窗口,首先我们需要一个容器作为窗口的基本框架,通常通过派生或使用类Frame或Applet来作这个容器。在例9.1中,我们引入并派生了类Frame,设置为基本窗口(行1,行5)。为了处理交互事件,我们还引入了包java.awt.event(行3)。
  例9.1仍旧使用读者已经熟悉的main方法来作为执行程序的起点(行6)。然而,这里的main方法只简单的创建了一个WelcomeWin的对象,所有实际的工作都在WelcomeWin的构造方法中完成。
  行9~15是WelcomeWin的构造方法。它首先通过行10的语句:
  super("My First Try!";
调用类Frame的构造方法
  Frame(String title);
其中参数
  “My First Try!"
被设置为窗口的标题。接下来行11调用方法
  pack();
来为窗口“打包”,根据窗口中的组件设置窗口大小,并将组件组装起来。12行语句
  setSize(300,150);
将窗口重新设定为300×150象素单位的规格。13行的语句
  addWindowListener(new MyAdapter());
为创建的窗口添加了一个类MyAdapter的对象作为窗口事件监听器。14行使用方法
  setVisible(true);
显示窗口。将例9.1程序编译运行,将显示出如图9.3的窗口。
  细心的读者也许会觉得疑惑,在WelcomeWin的main方法和构造方法中都没有显式调用行14~16的paint方法,那么是如何在窗口上显示出字串“Welcome to Windows Programming!”的呢?实际上我们定义的类WelcomeWin通过继承类Frame成为类Component的间接子类,而Component的所有子类在被显示时都将自动调用paint方法。因此我们在例9.1程序中重写的方法paint在执行setVisible时被自动调用,显示出设定的字符串。
  同样,在发生用户操作引发的窗口事件时,类MyAdapter作为监听器的对象将自动被调用,寻找相应的处理段。类MyAdapter的定义语句段为行20~24。这个类是专用于监听窗口事件的适配器类WindowAdapter的子类:
  class MyAdapter extends WindowAdapter
WindowAdapter是一个虚类,包含一系列处理窗口事件的虚方法。这里我们只重写了它的一个方法,即行21~23的windowClosing方法:
  public void windowClosing(WindowEvent e)
方法所带的参数是一个WindowEvent类的对象。该类的对象代表在程序执行期间发生的窗口事件,譬如窗口的关闭或移动。本方法只处理窗口关闭事件,当用户以鼠标点击窗口最右上角的小图标,要求关闭窗口时被调用,通过语句
  System.exit(0);
终止本次执行。这个简单的方法实际上是非常重要县城不可缺少的。读者可以尝试将程序中windowClosing方法去掉,再重新编译执行。我们发现窗口不再响应用户操作,无法将窗口关闭,处理一种“死机”状态。
  例9.1程序展示了Java的窗口程序最基本最简单的结构,它所建立的窗口没有添加任何组件。下面我们就来进一步看看如何在窗口中添加组件,以及如何安排组件的位置。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
39#
 楼主| 发表于 2006-6-28 04:24 | 只看该作者
 2.组件和布局
  在窗口上添加新的组件是通过调用容器基本类Container的方法
    add(Component comp);
进行的,其中Component类参数comp为添加的组件。由于我们用到的所有容器都从Container派生而来,因而使用add方法是十分方便有效的。同样,安排窗口上组件的位置是通过调用Container的另一个方法。
    setLayout(LayoutManager lmr);
对窗口本身设置布局来实现,其中setLayout为方法名,所带参数lmr为布局类对象。
  在AWT中,布局类专门用以控制窗口的组件位置和大小。这样的布局类共有五种:
  ■BorderLayout
  ■CardLayout
  ■FlowLayout
  ■GridLayout
  ■GridBagLayout
  (1)BorderLayout是Frame对象的缺省布局设置,将窗口的区域分为东、南、西、北、中五部分,如图9.4所示。相应的组件加入时要以
    add(String direction,Component comp);
的形式进行,其中字符型参数direction的取值为“East”、“West”、“South”、“North”、“Center”中任一种。

  ┏━━━━━━━━━━━━━━━━━━━━┓
  ┃       North        ┃
  ┠----┬--------┬------┨
  ┃West│ Center │East  ┃
  ┠----┴--------┴------┨
  ┃       South        ┃
  ┗━━━━━━━━━━━━━━━━━━━━┛
   图9.4BorderLayout示意

  (2)FlowLayout是Panel对象的缺省布局设置,它将使容器在添加组件时以从左至右。从上至下的顺序进行。例如程序段:
  Panel p=new Panel();
  p.add(new Button("Button 1");
  p.add(new Button("Button 2");
  p.add(new Button("Button 3");
依次生产三个Button对象,并将它们添加到Panel对象p中,p的显示结果如图9.5所示。

  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  ┃ P                         ┃
  ┃┏━━━━━━━┓┏━━━━━━━┓┏━━━━━━━┓┃
  ┃┃Button1┃┃Button2┃┃Button3┃┃
  ┃┗━━━━━━━┛┗━━━━━━━┛┗━━━━━━━┛┃
  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
          图9.5 FlowLayout示意

  (3)GridLayout以n行×m列的方格形式组织容器布局,每一格的大小是一致的。其中n,m为创建该类对象时所带的参数。例如命令
  setLayout(new GridLayout(2,3));
设置的布局形式为2行3列,如图9.6所示。

  ┏━━━━━┳━━━━━┳━━━━━┓
  ┃(0,0)┃(1,0)┃(2,0)┃
  ┣━━━━━╋━━━━━╋━━━━━┫
  ┃(0,0)┃(1,0)┃(2,0)┃
  ┗━━━━━┻━━━━━┻━━━━━┛
      图9.6 GridLayout示意

  (4)CardLayout将容器内的组件设置为类似叠放的“卡片”的形式,一次只显示一张“卡片”。最初显示的是第一张,其余各张按序放置在第一张后面。CardLayout类提供若干特殊的方法实现这些“卡片”的显示,包括:
  next()显示下一组件
  previous()显示前一组件
  first()显示第一组件
  last()显示最后一个组件
  (5)GridBagLayout是最复杂也是最灵活的一个布局类。同GridLayout类似,它也以方格组织容器布局,然而每一个方格的大小可以是没的。用户可通过类GridBagConstraints来控制各方格的位置和大小。具体的使用我们将在后面的章节中详细叙述。
  例9.2WindowsApp.java程序文件。
  1:import java.awt.*;
  2:import java.awt.event.*;
  3://类WindowsApp实现ActionListener接口以处理按钮事件
  4ublic class WindowsApp implements ActionListener{
  //两个用于显示的字符串
  5: String defaultText="Welcome to Windows Programming!";
  6: String alterText="You will have lots of fun in Windows!";
  7: Label label;//可改变显示的标签对象
  8:
  9:  public static void main(String args[]){//main方法
  10:  WindowsApp app=new WindowsApp();
  11: }
  12:
  13: public WindowsApp(){ //构造方法
  14:  Frame f=new Frame("Welcome";
  15:  setup(f);
  16:  f.pack();//为窗口打包,根据窗口中的组件设置窗口大小并将组件组装起来,是java.awt.Window的方法
  17:  f.setSize(260,300);
  18:  f.addWindowListener(new MyAdapter());
  19:  f.setVisible(true);
  20: }
  21: void setup(Frame f){
  22:  label=new Label();//设置标签
  23:  label.setText(defaultText);
  24:  Panel buttons=new Panel();
  25:  Button b;//设置按钮
  26:  buttons.add(b=new Button("Change");
  27:  b.addActionListener(this);
  28:  buttons.add(b=new Button("Exit");
  29:  b.addActionListener(this);
  30:  f.add("Center",label);//加入标签和按钮
  31:  f.add("South",buttons);
  32: }
  33:
  34: public void actionPerformed(ActionEvent e){//处理按钮事件
  35:  Button b=(Button)e.getSource();
  36:  if("Change".equals(b.getLabel())){//改变标签显示
  37:  if(defaultText.equals(label.getText()))
  38:  label.setText(alterText);
  39:  else label.setText(defaultText);
  40: }
  41: else if("Exit".equals(b.getLabel()))//关闭窗口,退出
  42:  System.exit(0);
  43: }
  44:}
  45:class MyAdapter extends WindowAdapter{
  46: public void windowClosing(WindowEvent e){//处理窗口关闭事件
  47:  System.exit(0);
  48: }
  49:}
  在这个例子中,我们使用类Frame作为基本容器窗口,同样使用简单的main()方法作为程序执行的起点,不同的是我们在窗口中添加了三个组件:一个标签和两个按钮。语句行21~32的setup方法完成窗口的设置工作。
  标签label首先由构造方法创建,然后通过Label类的setText方法设定标签上显示的字符串,由下列语句实现:
  22:label=new Label();
  23:label.setText(defaultText);
其中用于显示的字符串defaultText和alterText都定义为类WindowsApp的成员变量,在这个类里相当于全程常量使用。
  按钮则通过在Panel类对象buttons中添加设置:
  26:buttons.add(b=new Button("Change");
  28:buttons.add(b=new Button("Exit");
其中传递给构造方法Button的字符串参数将显示在按钮上作为功能提示。由于Panel类的缺省布局为FlowLayout,两个按钮设置为左右并置的形式,且位置居于buttons的中部。最后我们将标签和按钮加入整个窗口(30~31行) 。由于Frame类的缺省布局为BorderLayout,语句
  f.add("South",buttons);
将按钮置于屏幕下方。编译并运行例9.2程序,将在屏幕上得到显示结果如图9.7所示。
  这里的事件处理过程也比例9.1复杂,它加入了对按钮事件的处理。在AWT中,程序执行期间某按钮被按下,产生的事件是ActionEvent类的对象。相应的监听处理接口为ActionListener,它定义的处理方法名为actionPerformed。因此为了方便的处理按钮事件,类WindowsApp完成了actionPerformed方法以实现ActionListener接口:
  4ublic class WindowsApp implements ActionListener
  34ublic void actionPerformed(ActionEvent e)
ActionEvent对象的方法getSource()返回一个Object对象,代表引发该ActionEvent事件的组件。在actionPerformed方法中,我们调用这个方法获取产生事件的组件并强制转换为Button类对象:
  35:Button b=(Button)e.getSource();
接下来通过调用类Button的“获取按钮显示文本”方法getLabel,判别究竟是哪一个按钮被按下:
  public String getLabel()
这里获取的文本是与各按钮被创建时传递的字符串参数一致的。当按钮“Change“按下时,标签label的显示内容变换。这通过调用类Label的方法,即下面的“取标签中的显示文本”方法getText和“设定标签显示文本”方法setText
  public String getText()
  public void setText(String text)
来实现。而当按钮“Exit”被按下时,同窗口关闭事件一样,撤销窗口,终止执行。读者可试着按动“Change”按钮,将得到如图9.8的改换后的显示窗口。不断按动“Change”按钮,窗口来回变换。而挥动“Exit”按钮,效果与点击右上角的图标是一样的:窗口撤销,执行结果。对关闭窗口事件的处理与例9.1一样,见行45~49。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
40#
 楼主| 发表于 2006-6-28 04:29 | 只看该作者
第十章 制作Applet
  在这一章,我们将讨论有关AppletHTML的内容,并介绍java.applet包所提供的支持。运用本章的知识,将能够开发自己的Applet和动态页面。

10.1 进一步认识Applet
  前文我们曾给出了一个Applet的简单示例,它提供了不少信息。
  Applet是Java语言的又一应用形式。它没有main方法,因而不能由解释器直接解释执行。为了运行它,我们需要把它放进Web页面。当这个页面在浏览器上显示时,Applet就在页面中指定的一部分区域内显示其运行结果。
   Web页面是用HTML语言编写的。HTML是Hypertext Markup Languarg的简称,一般译作超文本标记语言或超文本置标语言。HTML语言使用许多标记(tab)来描述一个页面。在这些标记中,有一个<APPLET>标记(有关HTML语言将在下文再作介绍,读者暂不必关心其细节)。Applet的有关信息就由这一标记引导的内容给出。这些内容和显示的许多属性,有的可以缺省,但至少应包括Applet的源路径(即,从哪儿找到Applet的.class文件),以及Applet显示区域的高度和宽度。当一个浏览器装入一个含有<Applet>标记的HTML语言编写的Web页面时,它会调用装入器,按照文档中Applet代码路径去寻找.class文件并执行它。
  Applet利用了浏览器的资源,当它被装入时,它的外部环境是浏览器预先定义的执行环境。然后浏览器才会根据HTML文本中的信息提供Applet所要求的环境。浏览器中的应用程序能显示图像,演奏声音等。Applet就是通过使用这些浏览器所提供的能力来工作的。
  Applet由运行时系统来构造。当它所在的页面被浏览器装入后,Applet就出生了。这时系统自动调用init()方法,进行一些必要的初始化工作。接着,系统将调用start()方法启动Applet的执行。当浏览器切换到别的页面时,stop()被调用,以终止Applet的执行。假如浏览器又切换回Applet所在页面,那么运行时系统将从调用start()方法开始Applet的又一次运行。当浏览器关掉时,Applet走到了它一生的终点。系统将先调用stop()停止它的执行,然后用destroy()方法来完成资源回收等收尾工作。如果浏览器重载页面,就会先令Applet死亡(依次调用stop()和destroy()),然后装入页面(调用init()),开始Applet的又一次生命。Applet的生命周期图示见图10.1。
    ┌────────┐     ┌─────────┐
    │  出生    ├────→│   启动    │
    │(Init())│   ┌→│(start())├┐关
    └────────┘   │ └─────────┘│掉
         切换回页面   │            │浏 
    ┌───────────┐│ ┌────────┐ │览 
    │  消亡       │└─┤   停止   │ │器
    │(destroy())│←─┤(stop())│←┘
    └───────────┘  └────────┘
     图10.1 Applet的生命周期图
  Applet本身是Panel的子类,它也有事件控制机制。上面四个方法是用来响应Java运行时系统产生的事件的。如果还有其它事件要处理(比如,按了一个按钮),那么可以在Applet中重写由 Component类继承来的handleEvent()方法(旧的API适用)或用监听者来监听和处理事件(1.1版的API适用)。
  Applet的应用很广,可以为页面带来动态交互内容,带来声音、动画效果,可以通过CGI(通用网关接口)与远程数据库相联系。Applet也可以打开窗口,做一些窗口程序中常做的事。如果把协议处理器(ProtocolHandler,将在§11.7介绍)等网络方面的元素与Applet结合起来,Applet的功能会更强。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表