4.1 包和抽象窗口工具(AWT)
1. 应用程序的创建一般遵循下面的步骤:
1).了解可以使用的类的性能和限制。
2).确定可用于一个工程项目的已有类
3).继承那些类,或定制它们以适应特定工程
4).覆盖或重载类中的方法以适应当前项目
5).在类中添加另外的方法,以使程序工作的更好
6).设计可用于有个或多个程序的类
4.2 基本的窗口程序
1. Frame类的对象其外观依赖于所使用的操作系统,Frame包含在一个方框内。如果一个Frame不再需要时,应调用dispose()方法撤销它。
2. Window类表示有没有边界和菜单的最高层的窗口,缺省的情况是用BorderLayout来声明一个布局。
3. Container类是一个可以包含和跟踪其他AWT组件的类。
4.3 基本Java Applet
1. Java Applet于Java Appletcation的区别:
1).一个独立的应用程序如果是图形界面则以Frame为基础,否则在DOS下运行,不扩展AWT的任何类,默认的程序入口是标准的main()方法
2).一个Applet是从java.applet.Applet类继承而来的类,它不需要包含标准的main方法。另外,Web浏览器提供了运行Applet的JVM.
2. 扩展Applet类的应用程序没有构造方法,也不需要main()复方法,它的执行由init()方法控制,Applet程序一旦装载后,init()方法只执行一次。
3. 将一个独立应用程序转换成为一个Applet程序,可遵循如下步骤:
1).装载java.applet类,将扩展Frame的类改为扩展Applet。
2).将构造方法更名为public void init(),由于init()方法是Applet的标准入口,去掉原构造方法在对超类的方法的调用以及对show()和pack()方法调用
3).去掉标准的main()方法
4).去掉所有对System.exit方法的调用。
5).如果有必要,覆盖public void start()方法和public void stop()方法
4. Java Applet不能改变窗口的大小
5. 要浏览Applet,可以使用如下命令:appletviewer filename.html,filename.html是HTML文档的名字。
6. Java Applet部分标记的参数及其定义:
1).CODEBASE: 包含类文件的URL,如果没有特别声明,类文件和HTML文档必须在同一个目录下
2).ARCHIVE: 一个或多个包含类文件和其他资源的档案夹,用于加速下载
3).CODE: 包含Applet类的文件名,它的位置和CODEBASE有关
4).NAME: 用于一个Applet于处在同一页的其他Applet进行通信的名字
5).WIDTH,HEIGHT: Applet显示区域的宽度和高度,不包括Applet产生的窗口和对话框
6).<PARAM NAME=”name” VALUE=”value”>: 一个Applet特殊属性,Applet有getParameter方法访问它们的属性。任何PARAM标志数字都可以使用。
4.4 事件处理
1. 事件是可视化组件或用户接口组件产生的信息,所有的事件都保存在系统级的事件队列中。
2. 事件可以分为两种类型:
1).低级事件:表示低级输入或在屏幕上发生可视组件窗口的系统事件,这些事件描述为
ComponentEvent、FocusEvent、InputEvent、KeyEvent、MouseEvent、ContanerEvent和
WindowEvent等事件类。
2).语义事件:包括接口组件产生的用户定义信息。这些事件描述为ActionEvent、AdjustmentEvent、
ItemEvent和TextEvent等事件类。
3. 在Java中,事件由分层的事件类表示,而接口则描述了都特定事件的响应方法。想要处理这些事件的类必须实现一个或多个接口以及这些接口中的方法。至于什么时候以及哪一个方法被调用则由JVM来处理。
4. 所有的事件都可表示为java.util.EventObject类的子类,并可以继承方法:public Object getSource()
5. 事件是由事件监听器来处理的。Java提供了响应特定事件的抽象“事件监听器“,它在java.awt.event包中被定义为接口,每个事件监听器都可以通过调用addXXXListener(XXXListener l)来依附于某个事件。
6. addXXXListener(XXXListener l)有两种方式:
1).如果类本身已经实现了相应的接口,则参数为this,如addActionListener(this);
2).如果类本身没有实现相应的接口,但其他类实现了相应的接口,则参数为其他类的一个对象。如
public class ListenerTest
{ private KeyEventHandler keyListener=new KeyEventHandler(); //该类实现了接口KeyListener
public ListenerTest() {addKeyListener(keyListener);}//参数为一接口类型的对象
}
7. 事件监听器中包含了对各种类型事件的响应方法,往往要在这些监听器的方法中调用到事件类本身的方法。
8. 如果在一个程序中要实现多个监听器接口,可以将程序分为多个类,每个类各自实现一个特定的监听器接口,在其他类中创建该类的对象,从而间接实现其他监听接口。使到程序更加清晰易懂。
9. Java提供了若干个适配器,它可作为事件监听器的超类使用。扩展的适配器类允许覆盖想要实现的特定方法,而其他未实现的方法则采用默认实现。
10.内部类是定义在另一个类中的类,它可以直接访问它所在类中的所有域和方法。要定义一个内部类,必须声明一个class类型的域和内部类的主体。
11.定义匿名内部类可以使用new关键字,后面跟一个class类型作为一个方法的输入参数。
someMethod(new ClassType([constructorInputList]))
{/*定义的内部类,包括域和方法*/}
如:addWindowListener(new WindowAdapter()
{ public void windowClosing(windowEvent we)
{System.exit(0);} //内部类的方法
});
本例中定义了一个匿名内部类,该类的类型是WindowAdapter类,但没有出现类名。
12.内部类通常用来定义一个急于处理的事件类,或者用于代码比较短并且用于某一个类的情况。匿名内部类很容易定义,但是它在被嵌套类的内部不能重用,而且匿名类没有构造方法。
13.当在内部类中访问被嵌套类的成员时,为了清晰起见,最好使用EnclosingClassName.this这种形式,
即被嵌套类(EnclosigClass)的当前对象(this)的成员变量(varable)。
4.5 GUI组件及布局管理器
1. 一个布局管理器确定个组件在显示区内的次序、相对大小和相对位置。布局管理器在AWT中定义为接口。一个布局管理器通过查询一个组件的getPreferredSize()方法获取该组件的所具有的大小,并按它们
的要求和规格来确定其位置。
2. 不同的面板可以使用另一个布局管理器将它们组合在一起并容纳在一个Frame和Applet或其他面板中。
3. Label是一个单行非编辑文本组件,标签可以被它的setText(String s)所修改,但不可以被用户直接修改。
4. 任何对用户是可见的文本,如标签,出错信息提示等,都应该定义为常量,这种外部在程序开发中易于修改。
5. List是一个顺序排列的、由字符串构成的项组成的表,当用户双击List的某一项时,可以产生一个动作事件;当选中某一项时,会产生item事件。
6. List中列表项的位置下标是从0开始,getItemCount()-1就是当前列表项的数目。
7. 对话框(Dialog)是一个Frame或另一个对话框拥有的窗口,如果它的父类窗口消失,它也随之消失。
8. 对话框有两中模式:
1).模态对话窗口(Model dialog): 这种对话框阻塞它的父类对象的输入,并且必须在它的父类对象再次获得输入之前,被关闭或自动消失。
2).非模态窗口(Non-Model dialog): 这种对话框并簿阻塞父类对象的输入,它可以与父类对象共存,除非特别声明,一般的对话框是非模态的。
4.6 图形和图形的绘制
1. Graphics类用于在一个可视组件内绘图。一个Graphics对象包含了绘图所必需包含的信息,其中包括坐标、色彩、字体和剪贴板区。
2. 绘图在一个二维坐标系中进行,该坐标的原点在组件的左上角。
3. Graphics对象不能初始化,因为Graphics类是一个抽象类,只能从现有的图形对象或使用Component的getGraphics方法得到。
4. Component类包含了如下3个绘图方法:
1).public void repaint():用于重绘图形或组件的外观发生变化,即大小改变或位置移动时,当repaint()方法被调用时,自动调用update()方法,update()方法再调用paint()方法。
2).public void update():用于更新图形,先清除背景,前景,再调用paint()方法。
3).public void paint(Graphics g):进行绘图操作,必须覆盖父类方法。
5. 当图形在显示区的坐标改变时,必须调用repaint()方法,图形在显示区的位置才会发生改变,否则图形在显示区的位置不变。
6. 通常不覆盖repaint()。可以覆盖update()方法来规定怎样清除绘图区,如定义背景颜色,但在覆盖代码中必须包含paint()方法。
7. Canvas的绘图方法并不是直接写入一个Frame(或Applet)中,而是写入Canvas。
8. Canvas时一个具有自己坐标系统的组件,使用布局管理器可以确定它在其他组件中的位置。
9. 为了创建一个graphics对象,首先创建一个类扩展Canvas类,并且覆盖paint方法,再将这个类作为一个另一个类的成员变量,加入到类似与Frame或Applet的类中,用某种布局管理器对其进行定位。这个类需要完成如下工作:
1). Frame(或Applet)作为控制者,确定所有组件的位置,处理用户的输入,并处理与其他对象的交互。
2).用Canvas处理绘图,它最重要的方法似paint。
10. 一个扩展Component的类可以继承它的getPreferredSize方法,这个方法由一个布局管理器调用后可以获得该组件的最佳大小。如果这个类本身使用布局管理器来增加一个组件,则getPreferredSize方法会自动调整其位置,使得所有的组件都得到合理的安排。如果需要特别说明组件的大小,则需要覆盖下述方法:public Dimension getPreferredSize(),一般来说,扩展Canvas的类都应该覆盖getPreferredSzie
方法。
1. 应用程序的创建一般遵循下面的步骤:
1).了解可以使用的类的性能和限制。
2).确定可用于一个工程项目的已有类
3).继承那些类,或定制它们以适应特定工程
4).覆盖或重载类中的方法以适应当前项目
5).在类中添加另外的方法,以使程序工作的更好
6).设计可用于有个或多个程序的类
4.2 基本的窗口程序
1. Frame类的对象其外观依赖于所使用的操作系统,Frame包含在一个方框内。如果一个Frame不再需要时,应调用dispose()方法撤销它。
2. Window类表示有没有边界和菜单的最高层的窗口,缺省的情况是用BorderLayout来声明一个布局。
3. Container类是一个可以包含和跟踪其他AWT组件的类。
4.3 基本Java Applet
1. Java Applet于Java Appletcation的区别:
1).一个独立的应用程序如果是图形界面则以Frame为基础,否则在DOS下运行,不扩展AWT的任何类,默认的程序入口是标准的main()方法
2).一个Applet是从java.applet.Applet类继承而来的类,它不需要包含标准的main方法。另外,Web浏览器提供了运行Applet的JVM.
2. 扩展Applet类的应用程序没有构造方法,也不需要main()复方法,它的执行由init()方法控制,Applet程序一旦装载后,init()方法只执行一次。
3. 将一个独立应用程序转换成为一个Applet程序,可遵循如下步骤:
1).装载java.applet类,将扩展Frame的类改为扩展Applet。
2).将构造方法更名为public void init(),由于init()方法是Applet的标准入口,去掉原构造方法在对超类的方法的调用以及对show()和pack()方法调用
3).去掉标准的main()方法
4).去掉所有对System.exit方法的调用。
5).如果有必要,覆盖public void start()方法和public void stop()方法
4. Java Applet不能改变窗口的大小
5. 要浏览Applet,可以使用如下命令:appletviewer filename.html,filename.html是HTML文档的名字。
6. Java Applet部分标记的参数及其定义:
1).CODEBASE: 包含类文件的URL,如果没有特别声明,类文件和HTML文档必须在同一个目录下
2).ARCHIVE: 一个或多个包含类文件和其他资源的档案夹,用于加速下载
3).CODE: 包含Applet类的文件名,它的位置和CODEBASE有关
4).NAME: 用于一个Applet于处在同一页的其他Applet进行通信的名字
5).WIDTH,HEIGHT: Applet显示区域的宽度和高度,不包括Applet产生的窗口和对话框
6).<PARAM NAME=”name” VALUE=”value”>: 一个Applet特殊属性,Applet有getParameter方法访问它们的属性。任何PARAM标志数字都可以使用。
4.4 事件处理
1. 事件是可视化组件或用户接口组件产生的信息,所有的事件都保存在系统级的事件队列中。
2. 事件可以分为两种类型:
1).低级事件:表示低级输入或在屏幕上发生可视组件窗口的系统事件,这些事件描述为
ComponentEvent、FocusEvent、InputEvent、KeyEvent、MouseEvent、ContanerEvent和
WindowEvent等事件类。
2).语义事件:包括接口组件产生的用户定义信息。这些事件描述为ActionEvent、AdjustmentEvent、
ItemEvent和TextEvent等事件类。
3. 在Java中,事件由分层的事件类表示,而接口则描述了都特定事件的响应方法。想要处理这些事件的类必须实现一个或多个接口以及这些接口中的方法。至于什么时候以及哪一个方法被调用则由JVM来处理。
4. 所有的事件都可表示为java.util.EventObject类的子类,并可以继承方法:public Object getSource()
5. 事件是由事件监听器来处理的。Java提供了响应特定事件的抽象“事件监听器“,它在java.awt.event包中被定义为接口,每个事件监听器都可以通过调用addXXXListener(XXXListener l)来依附于某个事件。
6. addXXXListener(XXXListener l)有两种方式:
1).如果类本身已经实现了相应的接口,则参数为this,如addActionListener(this);
2).如果类本身没有实现相应的接口,但其他类实现了相应的接口,则参数为其他类的一个对象。如
public class ListenerTest
{ private KeyEventHandler keyListener=new KeyEventHandler(); //该类实现了接口KeyListener
public ListenerTest() {addKeyListener(keyListener);}//参数为一接口类型的对象
}
7. 事件监听器中包含了对各种类型事件的响应方法,往往要在这些监听器的方法中调用到事件类本身的方法。
8. 如果在一个程序中要实现多个监听器接口,可以将程序分为多个类,每个类各自实现一个特定的监听器接口,在其他类中创建该类的对象,从而间接实现其他监听接口。使到程序更加清晰易懂。
9. Java提供了若干个适配器,它可作为事件监听器的超类使用。扩展的适配器类允许覆盖想要实现的特定方法,而其他未实现的方法则采用默认实现。
10.内部类是定义在另一个类中的类,它可以直接访问它所在类中的所有域和方法。要定义一个内部类,必须声明一个class类型的域和内部类的主体。
11.定义匿名内部类可以使用new关键字,后面跟一个class类型作为一个方法的输入参数。
someMethod(new ClassType([constructorInputList]))
{/*定义的内部类,包括域和方法*/}
如:addWindowListener(new WindowAdapter()
{ public void windowClosing(windowEvent we)
{System.exit(0);} //内部类的方法
});
本例中定义了一个匿名内部类,该类的类型是WindowAdapter类,但没有出现类名。
12.内部类通常用来定义一个急于处理的事件类,或者用于代码比较短并且用于某一个类的情况。匿名内部类很容易定义,但是它在被嵌套类的内部不能重用,而且匿名类没有构造方法。
13.当在内部类中访问被嵌套类的成员时,为了清晰起见,最好使用EnclosingClassName.this这种形式,
即被嵌套类(EnclosigClass)的当前对象(this)的成员变量(varable)。
4.5 GUI组件及布局管理器
1. 一个布局管理器确定个组件在显示区内的次序、相对大小和相对位置。布局管理器在AWT中定义为接口。一个布局管理器通过查询一个组件的getPreferredSize()方法获取该组件的所具有的大小,并按它们
的要求和规格来确定其位置。
2. 不同的面板可以使用另一个布局管理器将它们组合在一起并容纳在一个Frame和Applet或其他面板中。
3. Label是一个单行非编辑文本组件,标签可以被它的setText(String s)所修改,但不可以被用户直接修改。
4. 任何对用户是可见的文本,如标签,出错信息提示等,都应该定义为常量,这种外部在程序开发中易于修改。
5. List是一个顺序排列的、由字符串构成的项组成的表,当用户双击List的某一项时,可以产生一个动作事件;当选中某一项时,会产生item事件。
6. List中列表项的位置下标是从0开始,getItemCount()-1就是当前列表项的数目。
7. 对话框(Dialog)是一个Frame或另一个对话框拥有的窗口,如果它的父类窗口消失,它也随之消失。
8. 对话框有两中模式:
1).模态对话窗口(Model dialog): 这种对话框阻塞它的父类对象的输入,并且必须在它的父类对象再次获得输入之前,被关闭或自动消失。
2).非模态窗口(Non-Model dialog): 这种对话框并簿阻塞父类对象的输入,它可以与父类对象共存,除非特别声明,一般的对话框是非模态的。
4.6 图形和图形的绘制
1. Graphics类用于在一个可视组件内绘图。一个Graphics对象包含了绘图所必需包含的信息,其中包括坐标、色彩、字体和剪贴板区。
2. 绘图在一个二维坐标系中进行,该坐标的原点在组件的左上角。
3. Graphics对象不能初始化,因为Graphics类是一个抽象类,只能从现有的图形对象或使用Component的getGraphics方法得到。
4. Component类包含了如下3个绘图方法:
1).public void repaint():用于重绘图形或组件的外观发生变化,即大小改变或位置移动时,当repaint()方法被调用时,自动调用update()方法,update()方法再调用paint()方法。
2).public void update():用于更新图形,先清除背景,前景,再调用paint()方法。
3).public void paint(Graphics g):进行绘图操作,必须覆盖父类方法。
5. 当图形在显示区的坐标改变时,必须调用repaint()方法,图形在显示区的位置才会发生改变,否则图形在显示区的位置不变。
6. 通常不覆盖repaint()。可以覆盖update()方法来规定怎样清除绘图区,如定义背景颜色,但在覆盖代码中必须包含paint()方法。
7. Canvas的绘图方法并不是直接写入一个Frame(或Applet)中,而是写入Canvas。
8. Canvas时一个具有自己坐标系统的组件,使用布局管理器可以确定它在其他组件中的位置。
9. 为了创建一个graphics对象,首先创建一个类扩展Canvas类,并且覆盖paint方法,再将这个类作为一个另一个类的成员变量,加入到类似与Frame或Applet的类中,用某种布局管理器对其进行定位。这个类需要完成如下工作:
1). Frame(或Applet)作为控制者,确定所有组件的位置,处理用户的输入,并处理与其他对象的交互。
2).用Canvas处理绘图,它最重要的方法似paint。
10. 一个扩展Component的类可以继承它的getPreferredSize方法,这个方法由一个布局管理器调用后可以获得该组件的最佳大小。如果这个类本身使用布局管理器来增加一个组件,则getPreferredSize方法会自动调整其位置,使得所有的组件都得到合理的安排。如果需要特别说明组件的大小,则需要覆盖下述方法:public Dimension getPreferredSize(),一般来说,扩展Canvas的类都应该覆盖getPreferredSzie
方法。