《部分GUI程序设计.ppt》由会员分享,可在线阅读,更多相关《部分GUI程序设计.ppt(50页珍藏版)》请在三一办公上搜索。
1、Java GUI程序设计,内容与要求,主要内容1 JFC的组成2 应用程序和小程序界面图形化3 AWT的组件布局管理模型4 AWT的事件处理模型要求:掌握Swing与AWT的异同之处掌握界面布局的特点与使用方式掌握事件处理的特点与处理方式掌握编写GUI程序设计技术,1 JFC的组成,AWTSwingDrag and DropJava 2DJava Accessibility,Java基础类,JFC(Java Foundation Classes)JFC由5组API组成:AWT、Swing、Java 2D、Drag and Drop和Accessibility,基于对等组件的AWT,AWT(Ab
2、stract Window Toolkit)是一个独立平台的窗口工具组件集,它依赖于对等组件(Peer),而对等组件是一种本地GUI组件,由AWT类管理。AWT的作用是给用户提供基本的界面组件,如按钮、列表、菜单等等。AWT组件中,包含有对其对等组件的大量实用操作,而AWT类仅仅是对等组件外围的包装与操作工具,因此,对等组件可以快速产生一个GUI工具组件。对于最初的AWT,其开发组只用了不到6个星期的时间,但存在大量的缺陷。,重量组件及缺陷,AWT最初只包括与本地对等组件相关联的组件,称为重量组件(Heavyweight component)。这些组件在它们自己的本地不透明窗口中绘制,这样使用
3、将花费昂贵的代价,而且在更改其默认行为时,不可以为其扩展子类。它们必须是矩形的,而且不能有透明的背景。,轻量组件及特点,在AWT 1.1版本中引入。轻量组件直接扩展了或。轻量组件没有本地对等组件,它不在本地不透明窗口中绘制,而是在它们的重量容器窗口中绘制。轻量组件不会导致与它们关联的不透明窗口的性能损失,而且还可以有透明的背景。透明的背景使显示的轻量组件可以是非矩形的,虽然所有组件(重量的或轻量的)都有一个矩形边框。在轻量组件的容器中必须有一个是重量组件,否则无法在窗口内绘制轻量组件。,AWT组件的分类,菜单、按钮、标签、列表等组件的抽象基本类,AWT中大约有一半的类是从它这里扩展出来的。扩展
4、Component的抽象基本类。在容器中可以包含多个组件,我们可以使用容器将相关组件组合成一个整体,以简化程序GUI的设计,同时有利于组件的显示安排。由Container演变出来的类有Panel、Applet、Window、Dialog和Frame等。和java.awt.LayoutManager2定义容器中组件位置和尺寸方法的接口。Java中定义了几种默认的布局管理器,如FlowLayout、BorderLayout、CardLayout、GridLayout和GridBagLayout等定义组件内图形操作的基本类,每个组件都有一个相关的图形对象。,Swing和AWT的关系,Swing是用来
5、替代AWT的重量组件,而不是用来替代AWT本身。Swing使用AWT最好的部分来建立一个新的轻量组件集,并且丢弃了AWT中有问题的重量组件部分。Swing利用了AWT的底层组件,包括图形、颜色、字体、工具包和布局管理器。Swing没有使用AWT的顶层组件,除了Frame、Window和Dialog类,它们分别被Swing的重量组件JFrame、JWindow和JDialog所扩展。,插入式界面样式,Swing支持插入式界面样式(Pluggable Look-and-Feel),它的基础是模型视图控制(Model-View-Controller,MVC)架构。Swing组件的代理是Compone
6、ntUI类的一个扩展,它是Swing工具包中的一个Java类,其中定义了所有UI代理的公共行为,这些行为可以在扩展组件中进行修改。对于插入式界面样式,Swing组件的UI代理负责显示组件和处理输入事件的视图控制器。当Swing组件配备了一个修改过的组件UI时,组件的可视外观或事件处理都是可以修改的。,插入式界面样式举例:StyleChooser.java 可以看到:Swing界面可以有多种选择(通过修改lookAndFeel),而不再依赖于操作系统平台,Swing包(1),javax.swingSwing组件和实用工具。Swing轻量组件的边框。JColorChooser的支持类/接口。事件和
7、监听器类。JFileChooser的支持类/接口。抽象类,它定义UI代理的行为。实现所有标准界面样式公共功能的基类。用户界面代理类,它们实现Metal界面样式。用户界面代理类,它们可以用来实现两个或以上的界面样式。JTable组件的支持类。,Swing包(2),支持文档的显示和编辑。支持显示和编辑HTML文件。html文件的分析器类。支持显示和编辑RTF文件。JTree组件的支持类。支持取消操作。用户界面代理类,它们实现Motif界面样式。用户界面代理类,它们实现Mindows界面样式。用户界面代理类,它们实现GTK界面样式。,JComponent类的继承关系,JComponent类的优点,继
8、承于AWT容器,所以Swing组件具有容器特性。插入式界面样式或自定义Look and Feel外观。和Windows一样的快捷键。通用事件处理方法。组件的简短描述(通过调用停留提示工具)。根据不同国别进行本地化处理(Localization)。,Swing组件,Swing包含250多个类,是组件和支持类的集合。Swing组件除了提供替代AWT重量组件的轻量组件外,还提供了大量有助于开发GUI的附加组件,如表格、树、定制对话框等。为了把UI组件和支持类分开,Swing组件名字以“J”开头。,支持Drag and Drop的Swing组件,注:N/A为Not Available,无效 举例:La
9、belDnD.java(演示将Label标签对象的文本拖入文本编辑框中),Java 2D API中的包,颜色和颜色空间。2D API字体软件包。2D API几何软件包。支持打印2D API。JPEG图像处理工具包。图像渲染处理工具包。举例:LineArtDemo.java,Java Accessibility,Accessibility就是一个很有用的辅助技术或系统,帮助那些特殊人群使用用户界面,例如盲人或无法操作鼠标键盘的人。辅助系统包括屏幕阅读器,屏幕放大器和语音识别系统。它还提供了一个接口,允许辅助技术与JFC和AWT组件互动和通信。,2 应用程序和小程序界面图形化,Swing的根面板小
10、程序的典型例子应用程序的典型例子结合小程序和应用程序的典型例子,Swing基本容器的组成,根面板JRootPane类的组成,内容面板,内容面板是小程序和应用程序的应用基础,是JApplet和JFrame等基本容器类用来管理组件的代理。在添加内容的时候,事实上是把内容加到这些根面板的成员中去,而不是直接加到根面板对象中。其中最常用的是在自定义类(一般扩展JApplet或JFrame类)中把组件加入容器的内容面板,而不是把它们直接加入根面板对象中.我们定义放置组件的容器时调用的是getContentPane方法,而并没有getRootPane方法。,操作内容面板,如果有JRootPane类的实例r
11、ootPane添加组件child到该容器的语句类似于rootPane.getContentPane().add(child);把包含组件的面板myPane交由rootPane的内容面板进行展示的组件,那么语句类似rootPane.setContentPane(myPane);如果要改变组件的布局,实际上我们也是要操作内容面板,这个语句如下:rootPane.getContentPane().setLayout(new XXXLayout();,不是rootPane.add(child);,JApplet类和Swing小程序,我们把组件加在JApplet对象的内容面板中,而不是直接在JApple
12、t对象上。我们在内容面板中设置布局管理器,而不是直接在JApplet对象上。对JApplet对象的内容面板来说,默认的布局管理器是BorderLayout。这有别于Applet类的默认管理器为FlowLayout。在扩展JApplet的自定义类中,我们通常把组件的初始化放在init方法中实现。小程序的典型例子:AppletGUI.java,JFrame类和Swing应用程序,JFrame扩展了类,它是Swing的最高层容器之一,拥有与JApplet相似的特性。不同之处在于它是用来支持应用程序而不是小程序,而且,我们通常把组件的初始化代码块放在扩展JFrame的自定义类的构造方法中。Swing应
13、用程序最高层容器往往扩展JFrame类。因此,我们应该关心的是把希望展示的组件添加到JFrame扩展类的实例的内容面板中。举例:ApplicationGUI.java,结合小程序和应用程序的例子,结合Swing的小程序和应用程序意味这该类编译后既可以嵌入浏览器中执行,又可以通过java执行引擎引导执行。为了利用好小程序可以在浏览器中自动加载执行,我们通常会使这样的类直接扩展JApplet类,然后在main方法中创建一个JFrame外层面板框架,并把自定义类的一个实例的内容面板传递给这个JFrame对象的内容面板。举例:AnAGUI.java,3 AWT的组件布局管理模型,基于策略模式的授权模型
14、布局管理器类,基于策略模式的布局管理模型,定义了组件、容器和布局管理器之间的关系。定义一个算法集并把这个算法封装在一个类里的技术称为策略模式(Strategy pattern)。一个容器中的组件很可能经历一个尺寸变化和移动的过程。容器把对组件的布置整形和定位授权给一个布局管理器。不同的布局管理器使用不同的算法布置组件,容器可以通过使用适当的布局管理器自由选择布置算法。,容器的授权管理及布局管理器的策略模式,组件、容器和布局管理器之间的关系,一个组件对象只能位于一个容器中。容器知道如何添加和删除组件。当我们为一个容器添加或删除组件时,调用容器的validate方法时变化显示出来。容器不知道如何去
15、做布局管理。当容器改变大小或validate方法被调用时,布局管理器能自动调整容器的布局。容器的布局策略可以在运行时调整。布局管理器能重新计算布局,最上层容器框架的setVisible方法负责调用validate方法。,容器,每个容器都访问一个布局管理器,该布局管理器有责任对容器中的组件进行定位和整形。布局管理器由setLayout方法设定。如果没有对setLayout方法的调用,那么默认的布局管理器就被使用。setLayout方法的基本形式如下:public void setLayout(LayoutManager mgr)设置当前容器的布局管理器类。如果在运行时利用setLayout方法改
16、变一个容器的布局,布局管理器并不会自动更新,需调用validate方法(推荐):public void validate()有效化一个容器及其组件。,布局管理器类举例,FlowLayout类:FlowLayoutDemo.java BorderLayout类:BorderLayoutDemo.java GridLayout类:GridLayoutDemo.java CardLayout类:CardLayoutDemo.javaBoxLayout类:BoxLayoutDemo.java GridBagLayout类:GridBagLayoutDemo.java SpringLayout类:Spr
17、ingLayoutDemo.java 组合应用布局管理器:EmbeddedLayoutDemo.java,4 AWT的事件处理模型,基于观察者模式的授权模型事件源事件类事件监听器创建事件监听器对象,基于观察者模式的事件处理模型,观察者模式(Observer pattern)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。授权事件模型包括三部分来处理事件:事件源,事件和监听器。事件源是任何的用户界面组件,例如按钮,文本框,滚动条等等。事件都继承自类。事件监听器是一个实现事件接听器接口的对象,而这个接
18、口又继承自接口。在监听器类中的方法包含了一些功能,当相应的用户界面组件被调用时就需要执行这些功能。事件源产生并触发事件,事件一直传播到相应的事件监听器,然后监听器调用特定的方法处理事件。,基于观察者模式的事件处理授权模型,Java事件处理过程,事件源与监听器,为了接受所产生的事件,监听器对象需要与事件源注册,以确保监听器被调用。事件源注册监视器操作可以通过setXXXListener或addXXXListener方法进行,其中的“XXX”用来指某个具体的事件类型。相对而言,addXXXListener方法用得更多些,因为它可以从事件源注册多个事件监听器。可通过removeXXXListener
19、方法把监听器从事件源列表上删除监听器,以从事件源断开监听器。但是,如果某个类型的多个监听器向相同一个组件注册,虽然看起来通知的顺序应该符合监听器被加入到组件中的顺序,但这样的顺序是不确定的。,事件类,事件类代表事件本身。从本质上来说,它们就是从事件源传播到任何感兴趣的事件监听器对象的信息包。每个事件对象包含有关事件源的信息。事件也可能含有附加信息,包括:事件类型、改变了的值、事件期间任何单击的鼠标按钮等等。事件通常由系统生成,但是事件类提供创建事件对象的公共构造方法,可以使用事件生命周期的处理方法来分派这些用户生成的事件。事件类构架可用于创建用户定义的事件的出发点。,Java事件的分类,低层事
20、件 就是那些任何组件类型都能生成的事件。低层事件的例子可以是键盘或鼠标事件。从组件维护的监听器列表添加或删除低层监听器的方法(addXXXListencr和removeXXXListener方法)定义在Component和JComponent类内。高层事件(或者说语义事件)是组件特定的事件。高层事件只由GUI组件的一小部分子集生成。例如,只有实现Adjustable接口的组件,比如JScrollBar,才能生成AdjustmentEvent对象。从事件源监听器列表添加或删除高层事件监听器的方法一般定义在生成事件的类内。例如,JButton能够生成ActionEvent对象。addActionL
21、istener和removeActionListener方法定义在JButton类内。,通常使用的事件监听器接口及其方法,常用的事件、事件监听器及其支持的事件源组件,常用的事件、事件监听器及其支持的事件源组件,常用的事件、事件监听器及其支持的事件源组件,适配器类实现的监听器接口,举例:WindowListenerDemo.java,WindowAdapterDemo.java,创建事件监听器对象:由当前GUI主类实现,在这种方法,有时也称为自我监听,就是用组件实现监听接口并实现接口内的方法,需要注意的是这里的组件经常为容器。优点:因为事件处理代码包含在GUI代码内,事件处理方法能自动调用GUI
22、的私有成员。缺点:当有大量的GUI组件同时需要把事件送到同样的接口时,就可能产生混乱。举例:MainClassDemo.java,创建事件监听器对象:定义成独立的外部类,这种方法把事件处理代码和GUI代码分离开来了。事件监听器可以作为单独类来实现。这种方法的优点为,事件处理代码从GUI代码中完全剥离,成为一个独立的类,增强了可读性。而且在事件处理程序不需要调用GUI私有成员的情况下,也是很有用的。举例:OuterClassDemo.java,创建事件监听器对象:定义成内部类,这是方法1和方法2的结合。这种方法的优点是,事件处理程序可以调用外部类的私有成员,并且允许事件处理模块化。举例:Inne
23、rClassDemo.java,创建事件监听器对象:定义成匿名内部类,实现事件监听器最简洁的方法。它的优点就是处理简单的事件特别有用;而且,因为匿名类的定义在事件源注册时一起完成,我们更容易看出事件源关心的事件类型。它的缺点是当有较多的同类型事件监听器对象时,重复的代码也比较多。举例:AnonymousClassDemo.java 综合演示例子:EventProcessing.java,代码示例,ApplicationGUI.java Swing应用程序StyleChooser.java 插入式界面样式LineArtDemo.java Java 2D xxxxxxLayoutDemo.java LayoutWindowListenerDemo.java 监听器WindowAdapterDemo.java 监听适配器MainClassDemo.java GUI类作为侦听器OuterClassDemo.java 独立类作为侦听器InnerClassDemo.java 内部类作为侦听器AnonymousClassDemo.java 匿名类作为侦听器EventProcessing.java 事件处理综合,