第6章 图形用户界面(GUI)
98、(P305) 图形用户界面概况:Java最初问世时,Sun公司的发明者为用户编写了一个GUI类库,称为“抽象窗口工具包”(abstract windows toolskit),简称AWT 。它为用户提供了一个应用编程接口API。
99、(P306) 轻量组件和重量组件:向用户提供一个与平台无关的开发环境是Java的主要目标之一,但图形用户界面GUI的跨平台移植是最困难的事情,因为在不同计算机上创建的组件,例如Button组件在不同的两台机器上是会有差异的。 为此,Java AWT的开发者对抽象窗口工具包AWT的每个组件都引入一个对等体(peer),对等体实际上是一种具有本地外观和感觉的图形用户接口(GUI)组件,而Java程序所访问的是Java AWT中的一个抽象组件而不是实际在屏幕上所看见的组件,当程序运行时系统将自动创建一个该组件的对等体(peer),由它来负责执行该组件在本地计算机的显示和管理工作,而它听命于抽象对象的指挥。人们把这种拥有本地机器对等体的组件称为“重量组件”(heavyweight component)。 但这种基于本地机器对等体的体系结构因存在缺陷而不能完全确保在各种平台上组件的“外观和感觉”都一样,为此,1997年Sun和Netscape合作开发了JFC系统作为Java2内核的一部分,它包括AWT、Swing、2D等,而JFC的核心部分就是Swing用户界面组件,它使用大量轻量组件(lightweight component)来代替AWT中对应的重量组件。所谓轻量组件是不拥有上述本地机器对等体的组件,且是完全透明的。但Swing组件是用来替代AWT的重量组件而不是整个AWT, 事实上,AWT是Swing的基础,后者只是提供了功能更强的用户界面组件,且Swing仍使用AWT的新型事件处理模式,即delegation event model(授权型事件处理模式)。
100、(P307) Swing和AWT:a) Swing还使用AWT的下层重量组件,包括图形类(Image)、颜色类(Color)、字体类(Font)、工具箱类(Toolkit)和布局管理器类(LayoutManager)等,这些类在Swing中没有替代的轻量组件。 b) Swing也有重量组件,它的重量组件类只有窗口类(JWindow)、框架类(JFrame)、和对话框类(JDialog),它们不是用来替代AWT的窗口类(Window)、框架类(Frame)和对话框类(Dialog),而分别是这3个类的子类,所以Swing的重量组件也不是透明的。 c) AWT也有轻量组件,例如Component类和Container类。所有的Swing轻量组件类都是从AWT的Component类继承而来的。 d) 只需在AWT的组件名前加一个英文大写字母J就是对应的Swing轻量组件类名。如JButton、JLabel、JTextField等。现在的Java编程者大多使用这些Swing轻量组件类作为用户界面组件。
101、(P308) 应用程序的主窗口对象:应用程序(Application)的主窗口是java.awt.Frame类的一个对象,该对象是一个容器,其内可以包含其他用户界面组件,如按钮、标签和文本域等。
102、(P308) 容器类(java.awt.Container): 创建一个可视化的用户界面,除了使用像按钮类、标签类、文本域类、复选框类、菜单条类、菜单类、菜单子项类、列表框类、滚动条类等底层用户界面组件,还有可以作为容器的用户界面组件,如框架类(Frame)、面板类(Panel)、画布类(Canvas)、对话框类(Dialog)等。
102、(P309) 组件类(java.awt.Component): Container类也是Component类的一个子类。java.awt.Component类是一个抽象类,它为这些子类提供了许多共用的功能。像按钮类、标签类、文本域类、复选框类、菜单条类、菜单类、菜单子项类、列表框类、滚动条类等底层用户界面组件,还有可以作为容器的用户界面组件,如框架类(Frame)、面板类(Panel)、画布类(Canvas)、对话框类(Dialog)等都是Component类的子类。
103、(P312) 图形坐标系和设备坐标系:所谓“图形坐标系”就是Java程序运行时所使用的坐标系,它是用抽象的逻辑像素点(pixel)作为坐标值的基本单位,且与具体的输出设备无关。但是屏幕显示器的物理像素点的高度和宽度与打印机是不同的,这就是说,他们有各自的坐标系统,称为设备坐标系。设备坐标系与具体的物理设备有关。因此,存在着图形坐标系与设备坐标系的转换问题,这种转换是由Java系统自动完成的,编程者不必编写任何程序来处理它。只有当用户需要用功能更强的图形对象绘制图形时,才使用AWT提供的Graphics2D类。 初学者只需先掌握在图形坐标系下的编程方法。
104、(P314) 向容器添加组件的公有方法:若要把组件添加到容器,如添加到框架(Frame)对象中,通常都是调用java.awt.Component类或java.awt.Container类所提供的add()方法。
105、(P319 - P320) 如何寻找方法属于的类:根据面向对象程序的设计要点,上层类(超类)所具有的字段和方法全部被下层类(子类)自动继承。在该继承链上的某些子类又将其直接或间接超类的一些方法重新定义,以覆盖(override)其超类的同名方法,因此,在一条继承链上会碰到不少同名方法。若在调用方法时不知道它属于继承链上的哪个类,往往达不到目的。特别是在GUI程序中,编译和运行都正常,但就是得不到所需的GUI界面。编程者需要借助帮助系统和继承链的类层次结构图,从下层类对象上溯到上层类对象选择方法。具体地说,就是沿继承链向上搜索超类,找到最靠近它的超类,若该超类不满足条件则继续上溯,直到条件满足为止。
106、(P321) paint() 方法:抽象类Component定义了一个paint()方法,该方法不需要编程者书写调用语句,因为它是由程序隐式(自动)地进行调用。即,当第一次显示一个组件或者组件在屏幕上的图形被破坏需要修补时,系统以响应的方式自动地调用它,这与Windows的回调函数极其相似。回调函数是由程序员书写的,能被Windows操作系统自动调用的函数。而paint()方法也是由编程者书写,由Java虚拟机自动调用。
107、(P322) 主类、主窗口和组件的层序:通常将Java应用程序中含有main()方法的公有类称为主类。如果用AWT组件构建一个GUI界面的应用程序,则主类通常是Frame类的子类。创建一个主类对象通常就生成了应用程序的主窗口,在主窗口内可以先摆放象Canvas、Panel等容器类组件,然后再在这些容器类组件上添加标签、按钮、文本框等底层组件。主窗口内组件的层次关系,称为“组件的层序”。若都是重量组件或都是轻量组件,则按组件的添加顺序来确定组件层序的高低,先加入的层序高,后加入的层序低。
108、(P322) 画布组件和面板组件:画布组件是Canvas类的一个实例。Canvas类是抽象类Component类的直接子类。编程者可以用程序在其内绘制图形和文字。编程者可以扩展Canvas类,在子类中必须重写paint()方法。面板组件是Panel类的一个实例。Panel类是Container类的直接子类(注:如前所述,Container类也是Component类的子类),面板子类也有一个paint()方法,可以在其上绘制图形和文字,但因继承链不同,在使用上有一些差异。通常,都是用画布组件作为绘图的画板,而将像按钮、标签和文本框等组件则添加到一个作为容器的面板组件内。
109、(P323) 用AWT组件构建一个GUI应用程序的步骤:(a)通常,该应用程序的主类由Frame类继承而来。可以在主类的构造函数内完成应用程序GUI界面的构建工作。也可以把Frame类作为主类的一个成员,在主类的一个方法中生成该Frame类对象,从而完成GUI界面的构建过程。(b)在主类的构造方法内或其他方法内,按照组件层序由高至低地构建每个组件。(c)在主类的构造方法或其他方法体内,调用add()方法按照组件层序由高至低顺序地把所用的逐渐添加到对应的容器中。即,先把画布、面板等容器类组件添加到主窗口上,在把底层组件添加到容器组件上。 (d)在main()方法体内创建一个主类的实例,即生成一个该GUI应用程序的主窗口。再用setVisible()方法显示主窗口。
110、(P323) 在Java中所有的绘制操作(如绘制图形和绘制文本字符等)都必须通过抽象类Graphics的对象引用。
111、(P331) Java绘图的相关类和方法:Java要做到“一次编程、到处运行”,且还要求绘制的图形和组件,其“外观和感觉”都一样。同时,它所提供的图形用户界面不仅与图形外部设备无关,还必须能跨越所有的硬件和操作系统平台。抽象窗口工具箱(AWT)创建了一个与平台无关的通用API( JFC系统 ),在应用程序实际运行时,该通用API是应用程序与本地机API之间的一个连接接口,应用程序只与通用API打交道,经通用API把绘图信息转换后再指挥本地机API绘制各种组件和图形。JFC系统的核心Swing采用了一种新的模型、视图和控制器(MVC)设计范式。
112、(P332) AWT把图形处理分成两个不同的层次。在低层次上它处理原始图形和不同的外部设备,即将具体的物理设备,如显示器、打印机、绘图仪等,通过各自的设备驱动程序统一成为一个与设备无关的逻辑设备接口。对于同一个图形功能,在不同的绘图设备上,调用的都是同一个方法函数来编写实现图形功能的程序。 在高层次上它提供了大量的组件,如按钮、标签、画布、窗口、面板等。建立在AWT基础上的Swing组件做到了在各种平台上绘制的组件和图形,其外观和感觉具有相同的效果。
113、(P332) 与绘图程序有关的内容:(a)图形逻辑坐标系:(可参考前述的“图形坐标系”小节。)图形逻辑坐标系是应用程序Application和小程序Applet所使用的坐标系,以逻辑像素点为单位绘制图形。应用程序和小程序只与通用API打交道,它们都使用图形逻辑坐标系和逻辑像素点,Java虚拟机会自动地把它转换成物理设备(如显示器)的坐标系统。 (b)图形模式:Java的绘图环境提供了两种绘图模式,即绘画模式和异或模式(Paint模式和XOR模式),当绘制图形时,前者是将所绘点覆盖该绘图区原来的点,后者是将当前要绘制的图形和绘制区域内原来的图形进行“异或”处理后再绘制出来。绘画模式被Java虚拟机取用为默认模式,即当编程者没有设置绘图模式时,自动取用Paint模式来绘制图形。
114、(P337) Swing组件:Sun和Netscape两家公司通力合作开发出JFC(Java Foundation Class)系统,其核心部分是Swing工具包。Swing工具包以AWT工具包为基础加以扩展,添加了新的组件集合和支持类的集合,特别采用了MVC设计模式。编程者应用Swing工具包来编写Java程序,才能真正实现跨平台,并做到做到图形界面“外观和感觉”是一样的。 当我们学习了Swing工具包后,对于用户界面都应该尽可能采用Swing组件,而布局管理采用java.awt包中标准的布局管理器类,对于事件处理则采用java.awt.event包中的标准类。
115、(P338) MVC范式:按照面向对象程序设计的基本原则,某个类的一个对象只需完成一个任务,不要使它负责过多的事情而负担过重。MVC范式就是基于这一规则而设计的。它用如下三套互相独立的类和接口来描述一类组件。 (a)模型(model)。模型负责获取和管理组件的状态。用户若需要询问组件的状态,实际上是询问该组件的模型。javax.swing包中的各种组件,对于描述该组件状态和内容的模型都是用Model结尾的接口实现。例如, public interface ButtonModel implements ItemSelectable (b)视图(view)。 视图专门负责组件的绘制工作,主要涉及paint()方法。MVC设计范式的最大优点就是一个模型可以有多个视图,每个视图是一个不同侧面但内容却是完整的。一个模型的几个视图都是从不同侧面、用完整的内容来描述同一个模型的。当模型的控制器要修改模型的内容时,它会通知每个视图,而每个视图都会更新自己的显示。 (c)控制器(controller)。控制器专门负责管理和处理组件所接收到的事件。这些事件可能来自用户,也可能来自系统。 视图和控制器之间的通信不仅频繁,而且非常复杂,因此,JFC系统把两者封装成一个整体。
116、(P340) J组件: Swing包括250多个类,其中一部分用于用户界面的组件,它们多数封装在javax.swing程序包中,常称为Swing组件,另一部分是支持类。Swing建立在AWT基础之上,利用了AWT中包括绘制用户界面所要使用的颜色、字体和布局管理器等标准类,并提供了一些轻量组件替代AWT中对应的重量组件。这些Swing轻量组件最大限度地实现了在所有平台上的“外观和感觉”都一样。它们都是在AWT组件前加一个英文字母J 。
117、(P345) JFrame类是扩展了java.awt.Frame类的直接子类,它添加了支持JFC/Swing体系结构的组件类,由rootPane(顶层窗格)、layeredPane(分层窗格)、contentPane(内容窗格)、和glassPane(玻璃窗格)等四个窗格分层堆叠在一个JFrame容器中。
(P347) 对编程者来说,需要关心的事情是,如果向Swing容器内添加一些子组件则应该怎样编写程序?实际上,这些子组件是添加给内容窗格contentPane的。因此,无论对JFrame容器添加子组件,还是对JApplet容器添加子组件,都必须调用getContentPane()方法。例如:
JFrame frame = new JFrame();
Container contentPane = frame.getContentPane();
JPanel leftPanel = new JPanel();
contentPane.add(leftPanel);
118、(P354) AWT组件是使用对等体(peer)的重量组件,程序显示在屏幕上的各种组件是与平台无关的抽象型逻辑组件,不是具体的看得见、感觉得出的组件。要在屏幕上把该组件显示出来,应该把这种逻辑组件转换成本地机的组件信息才能进行。每个平台如windows、solaris、machintosh等都有自己一套完整的对等体集合与AWT组件一一对应,每当要在屏幕上显示一个AWT组件时,则将自动创建该组件的对等体。对等体负责把与平台无关的行为转换成本地机的行为,且对逻辑组件属性的任何修改都直接传递给对等体。可以说,对等体是对应逻辑组件的一个“副本”。
抽象类Toolkit所定义的各种方法就像“胶水(glue)”一样,把java.awt程序包中的AWT组件与java.awt.peer程序包中的“副本”连接起来,有些方法还可以直接询问本地机的操作系统。
119、(P355) MediaTracker类可用来跟踪声音、图像和录像等多媒体对象。
120、(P359) 要选定所显示文本字符的字体,必须创建一个Font类的对象,并调用相应的构造方法指定字体名和大小。
(P360) 字体在屏幕上的尺寸是以像素为单位的,若要准确测量某种字体的大小,可调用FontMetrics(字体公制)类所提供的一些方法。
121、(P363) Graphics类类似于Windows中的一个设备环境类(DC),它提供有绘制图形、图像和文本文件等一系列方法函数。
对AWT组件通常重写paint()方法绘制图形用户界面,而对Swing组件是重写paintComponent()方法。
122、(P363 --- P364) 绝对布局方式:调用从抽象类Component继承的setLocation()给底层组件定位。它必须由编程者计算子组件在父容器内的坐标位置,特别是当父容器组件的尺寸发生变化时,这种计算量非常繁琐,有时甚至不可能。把程序移植到另一个平台时,图形用户界面将出现异常。
布局管理器:为解决上述问题,Java专门提供一种组件布局的管理机制,称为“布局管理器”。它根据父容器的尺寸以及子组件的大小、形状和位置自动地把组件放到父容器中,且当父容器尺寸发生变化时,其内子组件的大小、形状和位置也随之发生变化。
123、(P364) 布局管理器的种类:在java.awt程序包中提供了5种具有不同风格布局管理的类,即FlowLayout类、BorderLayout类、GridLayout类、CardLayout类和GridBagLayout类等。它们都是Serializable接口与LayoutManager接口,或者是Serializable接口与LayoutManager2接口的实现类。
布局管理器的策略模式是,每个容器组件都关联着一个布局管理器,该容器把布局管理任务授权给这个布局管理器。
124、(P367) FlowoutLayout: 流程式布局。把所有子组件按添加顺序从左至右、从上至下摆放。若父容器宽度尺寸的限制,使得当前行再不能摆放下一个子组件,则流程式布局管理器就向下开辟一个新行重新按照从左至右的顺序继续摆放后面的子组件,直到所有子组件摆放完为止。当父容器尺寸发生变化时,其内的所有子组件会自动地重新布局以适应父容器尺寸所发生的变化。 对于每行的子组件,可以选择排列方式是放在容器居中,还是左对齐或右对齐。
BorderLayout: 边框式布局。它是默认的布局管理器。 它将容器分成“北”“南”“东”“西”“中”等5个区域,把子组件分别添加到父容器的某个区域中。不允许把两个以上的组件添加到同一个区域,即使编程者在一个区域放多个组件,则新放入的组件将替代原来的组件。 这种按地理位置布置组件的方式特别适用于嵌套新式的组件。 边框式的布局方式通常不单独使用,而是与流程式布局的面板配合使用,以便形成上面所说的嵌套形式的组件布局。
GridLayout: 网格式布局。 把父容器等分成尺寸相等的若干个网格单元,每个网格单元是一个小矩形区域,其内只能放一个子组件。创建该对象时必须指明网格的行数和列数。 当向父容器添加子组件时,网格式布局管理器将这些组件从容器左上角开始,按从左至右、从上至下的顺序依次排列。若当前行再不能摆放下一个网格,则网格式布局管理器就向下开辟一个新行重新按照从左至右的顺序继续摆放后面的网格,直到含有子组件的网格摆放完为止。 若只给定行数而列数指定为0, 则网格式布局管理器将根据容器的尺寸、给定的行数和子组件的个数自动计算出列数。 若只给定列数而行数指定为0, 则布局管理器同样会计算出行数。若行数和列数均为非0值,则实际上只采用行数值,而根据容器的尺寸、给定的行数和子组件的个数自动计算列数值。 每个子组件总是正好占据一个网格单元,且可以设置水平和垂直间隙作为约束条件控制它占据一个网格单元的多少区域,但不能使一个子组件占据多个网格单元。
CardLayout: 卡片式布局。 若创建一个CardLayout类的对象对某容器进行布局管理,则该容器内的所生成的每一个组件(也可以是容器组件)都当作一个“卡片”共享同一显示空间。 这多个卡片就构成了一个卡片组放在该容器内,但每次只能显示或处理一个卡片,即当一个卡片可见时,其他卡片均被隐藏起来。 它经常与其他布局管理器配合使用。
125、(P385) 事件、事件源、事件监听器:
事件是一个描述正在发生事情的对象,它用来描述程序、系统和用户之间的各种活动。
事件源即产生事件的对象,如图形用户界面的按钮、文本框和滚动条等。
事件监听器是接收、控制和处理由事件源所发出事件的对象。任何类的一个对象都可以指定为事件监听器,但编程者在实际应用 时应根据具体情况选择一个合适的对象。
126、(P384) 分层结构的事件模式(Hierarchical event mode): JDK1.0 版本采用基于继承机制的事件处理系统,称为“分层结构的事件模式”。它将所要处理的事件按所属类上溯到抽象类Component,因为Component类提供了许多处理事件的方法。缺点是 由于所引发事件的消息传递和组件间的交互作用经常引起难于查找的程序隐患。
授权型事件模式(Delegation event mode): 它是实现接收、控制和处理由事件源所发出的事件的一种新型机制。 要实现这种机制,必须按如下步骤写程序: (a)指定一个事件监听器,例如,选取一个框架、面板等组件所属类及它们的子类,且它们必须是ActionListener接口的实现类。(b)调用作为某种事件源的组件所提供的addActionListener方法,把作为事件监听器的一个对象添加给该事件源。这就是通常所说的“把一个事件监听器注册给事件源”,方法addActionListener称为“注册方法”。注:一个事件源对象可以注册多个事件监听器。(c)实现某事件监听器接口。即,要具体实现事件监听器接口中所声明的方法。
授权型事件模式的程序执行过程举例: 例如, 某容器内的一个按钮组件被按下,作为事件源的按钮就会创建一个ActionEvent类的对象,并自动调用ActionPerformed()方法,把ActionEvent类的对象传递给ActionPerformed()方法,然后,在方法体内处理该事件。(注:ActionPerformed()方法是ActionListener接口内的方法,也就是事件监听器内的方法)
127、(P385) 事件源、事件监听器、处理事件的方法是授权型事件处理模式的三个重要部分。设定某个类(一般是Component或Container的子类)作为事件监听器(即该类要实现ActionListener接口),要给事件源注册事件监听器(即作为事件源的组件调用addActionListener()方法), 在事件监听器类中实现actionPerformed()方法,这三个步骤就是设置授权型事件处理的方法。 简要的说,就是指定事件监听器,事件源注册事件监听器,在事件监听器类中实现actionPerformed()方法。
128、(P391) 所有事件在总体上可以分成高级事件和低级事件。高级事件又称为语义事件,低级事件包含组件事件和容器事件。 语义事件是用来描述用户操作所产生的事件,例如,“鼠标点击按钮”将产生一个动作事件,动作事件是一个典型的语义事件。组件事件是一个组件在移动、改变大小和可见属性发生变化时发生的事件,用java.awt.event.ComponentEvent类来描述它;而容器事件是把一个组件添加到容器,使容器的内容发生变化时产生的事件,用java.awt.eventContainerEvent类来描述它。 低级事件只负责通告,其图形用户界面的重新布局工作由AWT立即自动进行处理,不象动作事件那样需要调用事件监听器内的actionPerformed()方法。 低级事件是高级事件的基础,即一个高级事件的实现是通过一个个低级事件来完成的。 高级事件有动作事件、可调事件、项目事件和文本事件等4种,由java.awt.event程序包内的ActionEvent类、AdjustmentEvent类、ItemEvent类和TextEvent类来分别描述它们。
129、(P394) 在授权型事件模式中,每种类型的事件定义一个独立的类来描述,并有一个对应的接口,其内声明有处理该事件的方法函数。编程者应在它的实现类体内编写完成这些事件处理的程序片断,并把实现类的对象注册到事件源中作为该类型事件的监听器。
130、(P395) 监听适配器:有的监听器只声明有惟一的方法,而有的监听器接口声明了多个方法,在其实现类体内要实现这7种方法。然而,对于某些场合,编程者实际只关心其中的一个事件, 这样,如果每种事件的监听器接口所声明的方法不止一个,就配套提供一个XxxxAdapter类,用来实现父接口中的所有方法以满足这一语法要求。实际上,它只是一个抽象类,编程者扩展该抽象类派生出一个子类。子类可以根据实际需要,只实现这7种方法中的任意一种或几种。 这给实际编程带来很多便利。
131、(P433) applet(小应用程序):一种嵌入到Web页面中,并能在各种浏览器上运行的Java程序。它能制作出可动态变化和具有良好交互性能的Web页面。 java标准类库为applet提供了两个组件类,即java.applet.Applet和javax.swing.JApplet 。 一个applet的主类通常都是JApplet类或Applet类的直接子类。 Applet类是java.awt.Panel类的直接子类,JApplet类是Applet类的直接子类。 JApplet类还是Accessible和RootPaneContainer两个接口的实现类。
132、(P435) Applet类和JApplet类的主要区别:
(a) 添加子组件的方式不同。对于基于Applet的小应用程序applet,可以调用add()直接向父容器applet添加子组件。JApplet类对象的内部结构比Applet类的对象要复杂得多,它由rootPane、layoutPane、contentPane、glassPane等四个窗格分层堆叠在一个JApplet容器中,因此,只能把子组件添加到它的内容窗格中。
(b) 默认的布局管理器不同。Applet的默认布局管理器是流程式,即FlowLayout类的对象,而JApplet容器的默认布局管理器是边框式,即BorderLayout类的对象,且对子组件的默认约束为BorderLayout.CENTER 。
(c) JApplet容器可以安装菜单条,即JMenuBar类的一个对象,而Applet容器不能安装菜单条。
133、(P436) applet的生命周期方法:init()、start()、stop()、destroy()
applet的生命周期:
(a) 下载小应用程序:当用户在浏览器中进入到一个链接有applet的Web页面时将发生该事件,浏览器将自动调用init()方法,创建一个小应用程序applet的主类对象并初始化,然后调用start()方法启动applet开始运行。
(b) 离开小应用程序applet所在的Web页面:当用户从小应用程序applet所在的页面离开,浏览器自动调用stop()方法,停止运行小应用程序applet。
(c) 返回小应用程序applet所在的Weby页面:当用户再次进入以前访问过的小应用程序applet所在的Web页面时,浏览器自动调用start()方法,再次启动applet。
(d) 退出浏览器:浏览器先自动调用stop()方法令applet停止运行,再自动调用destroy()方法销毁运行applet的线程并释放所有对象占有的内存空间,回收分配给applet的所有系统资源。 applet的生命周期结束。
134、(P437) 小应用程序applet没有main()方法,它是根据在整个生命周期中所发生的关键事件,按照Java所确定的执行框架由浏览器自动调用上述的生命周期方法。 也就是说,它的执行过程与应用程序完全不同,即不是按顺序连续调用生命周期方法,而是响应式地调用生命周期方法。 在通常情况下,小应用程序applet的主类是Applet类和JApplet类的直接扩展,故而理所当然地继承了上述的4个生命周期方法。 只有在有些实际应用场合,即当某些生命周期方法不能满足要求时,才需要覆盖一个或几个生命周期方法,以使其满足应用需要。
135、(P442) 把applet嵌入到html文件中示例:
<Applet CODEBASE="." CODE="ProductApplet.class" WIDTH="400" HEIGHT="300">
<PARAM NAME=font VALUE="Helvetica" >
<PARAM NAME=size VALUE="16">
</Applet>
136、(P449) applet的安全性:Java采用了一种字节码验证机制,以确保下载的小应用程序applet不违反任何安全规则后,才启动它在一个称之为“沙箱(sandbox)”的运行环境中执行。“沙箱”对小应用程序applet的运行有如下限制:
(a)applet不能以任何方式访问本机文件系统。
(b)applet不能调用java.lang程序包中的System.exit()和Runtime类的exec()方法。
(c)applet可调用System.getProperties()方法获取Java版本信息,但不能用它获取用户或用户机器的信息。
(d)applet不能创建和处理不在自身线程组中的任何线程和线程组。
(e)applet只能与发送来本applet的服务器或远程主机建立网络连接。
(f)applet可以使用一个端口,但该端口只能接受与下载applet的主机所引入的连接。