面向对象程序设计教程.ppt_第1页
面向对象程序设计教程.ppt_第2页
面向对象程序设计教程.ppt_第3页
面向对象程序设计教程.ppt_第4页
面向对象程序设计教程.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 9 章 Java的图形用户界面,2020/8/2,Java面向对象程序设计教程,2,主要内容,9.1 JFC的组成 9.1.1 AWT 9.1.2 Swing 9.1.3 Drag and Drop 9.1.4 Java 2D 9.1.5 Java Accessibility 9.2 应用程序和小程序界面图形化 9.2.1 Swing的根面板 9.2.2 小程序的典型例子 9.2.3 应用程序的典型例子 9.2.4 结合小程序和应用程序的典型例子 9.3 AWT的组件布局管理模型 9.3.1 基于策略模式的授权模型 9.3.2 布局管理器类 9.4 AWT的事件处理模型 9.4.1 基于观

2、察者模式的授权模型 9.4.2 事件源 9.4.3 事件类 9.4.4 事件监听器 9.4.5 创建事件监听器对象,9.1 JFC的组成,2020/8/2,Java面向对象程序设计教程,4,Java基础类,Java Foundation Classes,JFC JFC由5个API组成:AWT、Swing、Java 2D、Drag and Drop和Accessibility,2020/8/2,Java面向对象程序设计教程,5,基于对等组件的AWT,AWT(Abstract Window Toolkit)是一个独立平台的窗口工具组件集,它依赖于对等组件(Peer),而对等组件是一种本地GUI组件

3、,由AWT类管理。 AWT的作用是给用户提供基本的界面组件,如按钮、列表、菜单等等。 AWT组件中,包含有对其对等组件的大量实用操作,而AWT类仅仅是对等组件外围的包装与操作工具,因此,对等组件可以快速产生一个GUI工具组件。 对于最初的AWT,其开发组只用了不到6个星期的时间,但存在大量的缺陷。,2020/8/2,Java面向对象程序设计教程,6,重量组件,AWT最初只包括与本地对等组件相关联的组件,称为重量组件(Heavyweight component)。 这些组件在它们自己的本地不透明窗口中绘制,这样使用将花费昂贵的代价,而且在更改其默认行为时,不可以为其扩展子类。 它们必须是矩形的,

4、而且不能有透明的背景。,2020/8/2,Java面向对象程序设计教程,7,轻量组件,在AWT 1.1版本中引入 。 轻量组件直接扩展了java.awt.Component或java.awt.Container。 轻量组件没有本地对等组件,它不在本地不透明窗口中绘制,而是在它们的重量容器窗口中绘制。 轻量组件不会导致与它们关联的不透明窗口的性能损失,而且还可以有透明的背景。 透明的背景使显示的轻量组件可以是非矩形的,虽然所有组件(重量的或轻量的)都有一个矩形边框。 在轻量组件的容器中必须有一个是重量组件,否则无法在窗口内绘制轻量组件。,2020/8/2,Java面向对象程序设计教程,8,AWT

5、组件的分类,java.awt.Component菜单、按钮、标签、列表等组件的抽象基本类,AWT中大约有一半的类是从它这里扩展出来的。 java.awt.Container扩展Component的抽象基本类。在容器中可以包含多个组件,我们可以使用容器将相关组件组合成一个整体,以简化程序GUI的设计,同时有利于组件的显示安排。由Container演变出来的类有Panel、Applet、Window、Dialog和Frame等。 java.awt.LayoutManager和java.awt.LayoutManager2定义容器中组件位置和尺寸方法的接口。Java中定义了几种默认的布局管理器,如F

6、lowLayout、BorderLayout、CardLayout、GridLayout和GridBagLayout等 java.awt.Graphics定义组件内图形操作的基本类,每个组件都有一个相关的图形对象。,2020/8/2,Java面向对象程序设计教程,9,Swing和AWT的关系,Swing是用来替代AWT的重量组件,而不是用来替代AWT本身。 Swing使用AWT最好的部分来建立一个新的轻量组件集,并且丢弃了AWT中有问题的重量组件部分。 Swing利用了AWT的底层组件,包括图形、颜色、字体、工具包和布局管理器。 Swing没有使用AWT的顶层组件,除了Frame、Window

7、和Dialog类,它们分别被Swing的重量组件JFrame、JWindow和JDialog所扩展。,2020/8/2,Java面向对象程序设计教程,10,插入式界面样式,Swing支持插入式界面样式(Pluggable Look-and-Feel),它的基础是模型视图控制(Model-View-Controller,MVC)架构。 Swing组件的代理是ComponentUI类的一个扩展,它是Swing工具包中的一个Java类,其中定义了所有UI代理的公共行为,这些行为可以在扩展组件中进行修改。 对于插入式界面样式,Swing组件的UI代理负责显示组件和处理输入事件的视图控制器。 当Swin

8、g组件配备了一个修改过的组件UI时,组件的可视外观或事件处理都是可以修改的。,2020/8/2,Java面向对象程序设计教程,11,插入式界面样式举例:StyleChooser.java,2020/8/2,Java面向对象程序设计教程,12,Swing包,javax.swingSwing组件和实用工具。 javax.swing.borderSwing轻量组件的边框。 javax.swing.colorchooserJColorChooser的支持类/接口。 javax.swing.event事件和监听器类。 javax.swing.filechooserJFileChooser的支持类/接口。

9、 javax.swing.plaf抽象类,它定义UI代理的行为。 javax.swing.plaf.basic实现所有标准界面样式公共功能的基类。 javax.swing.plaf.metal用户界面代理类,它们实现Metal界面样式。 javax.swing.plaf.multi用户界面代理类,它们可以用来实现两个或以上的界面样式。 javax.swing.tableJTable组件的支持类。,javax.swing.text支持文档的显示和编辑。 javax.swing.text.html支持显示和编辑HTML文件。 javax.swing.text.html.parserhtml文件的分

10、析器类。 javax.swing.text.rtf支持显示和编辑RTF文件。 javax.swing.treeJTree组件的支持类。 javax.swing.undo支持取消操作。 com.sun.java.swing.plaf.motif用户界面代理类,它们实现Motif界面样式。 com.sun.java.swing.plaf.windows用户界面代理类,它们实现Mindows界面样式。 com.sun.java.swing.plaf.gtk用户界面代理类,它们实现GTK界面样式。,2020/8/2,Java面向对象程序设计教程,13,JComponent类的继承关系,2020/8/2

11、,Java面向对象程序设计教程,14,JComponent类的优点,继承于AWT容器,所以Swing组件具有容器特性。 插入式界面样式或自定义Look and Feel外观。 和Windows一样的快捷键。 通用事件处理方法。 组件的简短描述(通过调用停留提示工具)。 根据不同国别进行本地化处理(Localization)。,2020/8/2,Java面向对象程序设计教程,15,Swing组件,Swing包含250多个类,是组件和支持类的集合。 Swing组件除了提供替代AWT重量组件的轻量组件外,还提供了大量有助于开发GUI的附加组件,如表格、树、定制对话框等。 为了把UI组件和支持类分开,

12、Swing组件名字以“J”开头。 参见表9.2 、 9.3,2020/8/2,Java面向对象程序设计教程,16,支持Drag and Drop的Swing组件,注:N/A为Not Available,无效 举例: LabelDnD.java,2020/8/2,Java面向对象程序设计教程,17,Java 2D API中的包,java.awt.color颜色和颜色空间。 java.awt.font2D API字体软件包。 java.awt.geom2D API几何软件包。 java.awt.print支持打印2D API。 com.sun.image.codec.jpegJPEG图像处理工具包

13、。 java.awt.image.renderable图像渲染处理工具包。 举例: LineArtDemo.java,2020/8/2,Java面向对象程序设计教程,18,Java Accessibility,Accessibility就是一个很有用的辅助技术或系统,帮助那些特殊人群使用用户界面,例如盲人或无法操作鼠标键盘的人。 辅助系统包括屏幕阅读器,屏幕放大器和语音识别系统。它还提供了一个接口,允许辅助技术与JFC和AWT组件互动和通信。,9.2 应用程序和小程序界面图形化,2020/8/2,Java面向对象程序设计教程,20,Swing基本容器的组成,2020/8/2,Java面向对象程

14、序设计教程,21,根面板JRootPane类的组成,2020/8/2,Java面向对象程序设计教程,22,内容面板,内容面板是小程序和应用程序的应用基础,是JApplet和JFrame等基本容器类用来管理组件的代理。 我们在添加内容的时候,事实上是把内容加到这些根面板的成员中去,而不是直接加到根面板对象中。 其中最常用的是在自定义类(一般扩展JApplet或JFrame类)中把组件加入容器的内容面板,而不是把它们直接加入根面板对象中. 我们定义放置组件的容器时调用的是getContentPane方法,而并没有getRootPane方法。,2020/8/2,Java面向对象程序设计教程,23,操

15、作内容面板,如果有JRootPane类的实例rootPane 添加组件child到该容器的语句类似于rootPane.getContentPane().add(child); 把包含组件的面板myPane交由rootPane的内容面板进行展示的组件,那么语句类似rootPane.setContentPane(myPane); 如果要改变组件的布局,实际上我们也是要操作内容面板,这个语句如下:rootPane.getContentPane().setLayout(new XXXLayout();,不是 rootPane.add(child);,2020/8/2,Java面向对象程序设计教程,24

16、,JApplet类和Swing小程序,我们把组件加在JApplet对象的内容面板中,而不是直接在JApplet对象上。 我们在内容面板中设置布局管理器,而不是直接在JApplet对象上。 对JApplet对象的内容面板来说,默认的布局管理器是BorderLayout。这有别于Applet类的默认管理器为FlowLayout。 在扩展JApplet的自定义类中,我们通常把组件的初始化放在init方法中实现。 小程序的典型例子:AppletGUI.java,2020/8/2,Java面向对象程序设计教程,25,讨论: AppletGUI.java,如果把 public void init() c=

17、getContentPane(); Icon icon=new ImageIcon(swing.gif); label=new JLabel(Swing标签, icon, SwingConstants.CENTER); c.add(label, BorderLayout.CENTER); ,改为 public void init() JPanel panel=new JPanel(); Icon icon=new ImageIcon(swing.gif); label=new JLabel(Swing标签, icon, SwingConstants.CENTER); panel.add(lab

18、el); 进一步完成程序,使得程序中label组件的内容也能显示出来,并且布局和原程序一致。,2020/8/2,Java面向对象程序设计教程,26,JFrame类和Swing应用程序,JFrame扩展了java.awt.Frame类,它是Swing的最高层容器之一,拥有与JApplet相似的特性。不同之处在于它是用来支持应用程序而不是小程序,而且,我们通常把组件的初始化代码块放在扩展JFrame的自定义类的构造方法中。 Swing应用程序最高层容器往往扩展JFrame类。因此,我们应该关心的是把希望展示的组件添加到JFrame扩展类的实例的内容面板中。 举例:ApplicationGUI.ja

19、va,2020/8/2,Java面向对象程序设计教程,27,结合小程序和应用程序的例子,结合Swing的小程序和应用程序意味这该类编译后既可以嵌入浏览器中执行,又可以通过java执行引擎引导执行。 为了利用好小程序可以在浏览器中自动加载执行,我们通常会使这样的类直接扩展JApplet类,然后在main方法中创建一个JFrame外层面板框架,并把自定义类的一个实例的内容面板传递给这个JFrame对象的内容面板。 举例: AnAGUI.java,9.3 AWT的组件布局管理模型,2020/8/2,Java面向对象程序设计教程,29,基于策略模式的布局管理模型,定义了组件、容器和布局管理器之间的关系

20、。 定义一个算法集并把这个算法封装在一个类里的技术称为策略模式(Strategy pattern)。 一个容器中的组件很可能经历一个尺寸变化和移动的过程。容器把对组件的布置整形和定位授权给一个布局管理器。不同的布局管理器使用不同的算法布置组件,容器可以通过使用适当的布局管理器自由选择布置算法。,2020/8/2,Java面向对象程序设计教程,30,容器的授权管理及布局管理器的策略模式,2020/8/2,Java面向对象程序设计教程,31,组件、容器和布局管理器之间的关系,一个组件对象只能位于一个容器中。 容器知道如何添加和删除组件。 当我们为一个容器添加或删除组件时,调用容器的validate

21、方法时变化显示出来。 容器不知道如何去做布局管理。 当容器改变大小或validate方法被调用时,布局管理器能自动调整容器的布局。 容器的布局策略可以在运行时调整。 布局管理器能重新计算布局,最上层容器框架的setVisible方法负责调用validate方法。,2020/8/2,Java面向对象程序设计教程,32,容器,每个容器都访问一个布局管理器,该布局管理器有责任对容器中的组件进行定位和整形。 布局管理器由setLayout方法设定。如果没有对setLayout方法的调用,那么默认的布局管理器就被使用。 setLayout方法的基本形式如下:public void setLayout(L

22、ayoutManager mgr)设置当前容器的布局管理器类。 如果在运行时利用setLayout方法改变一个容器的布局,布局管理器并不会自动更新,需调用validate方法(推荐):public void validate()有效化一个容器及其组件。 另外,doLayout方法也可以用来更新布局管理:public void doLayout()使容器更新布局。,2020/8/2,Java面向对象程序设计教程,33,布局管理器类举例,FlowLayout类: FlowLayoutDemo.java BorderLayout类:BorderLayoutDemo.java GridLayout类:

23、GridLayoutDemo.java CardLayout类:CardLayoutDemo.java BoxLayout类:BoxLayoutDemo.java GridBagLayout类:GridBagLayoutDemo.java SpringLayout类:SpringLayoutDemo.java 组合应用布局管理器:EmbeddedLayoutDemo.java,9.4 AWT的事件处理模型,2020/8/2,Java面向对象程序设计教程,35,基于观察者模式的事件处理模型,观察者模式(Observer pattern)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主

24、题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 授权事件模型包括三部分来处理事件:事件源,事件和监听器。 事件源是任何的用户界面组件,例如按钮,文本框,滚动条等等。 事件都继承自java.util.EventObject类。 事件监听器是一个实现事件接听器接口的对象,而这个接口又继承自java.util.EventListener接口。在监听器类中的方法包含了一些功能,当相应的用户界面组件被调用时就需要执行这些功能。 事件源产生并触发事件,事件一直传播到相应的事件监听器,然后监听器调用特定的方法处理事件。,2020/8/2,Java面向对象程序设计教程,

25、36,基于观察者模式的事件处理授权模型,2020/8/2,Java面向对象程序设计教程,37,Java事件处理过程,2020/8/2,Java面向对象程序设计教程,38,事件源与监听器,为了接受所产生的事件,监听器对象需要与事件源注册,以确保监听器被调用。 事件源注册操作可以通过setXXXListener或addXXXListener方法进行,其中的“XXX”用来指某个具体的事件类型。 相对而言,addXXXListener方法用得更多些,因为它可以从事件源注册多个事件监听器。 可通过removeXXXListener方法把监听器从事件源列表上删除监听器,以从事件源断开监听器。但是,如果某个

26、类型的多个监听器向相同一个组件注册,虽然看起来通知的顺序应该符合监听器被加入到组件中的顺序,但这样的顺序是不确定的。,2020/8/2,Java面向对象程序设计教程,39,事件类,事件类代表事件本身。从本质上来说,它们就是从事件源传播到任何感兴趣的事件监听器对象的信息包。 每个事件对象包含有关事件源的信息。事件也可能含有附加信息,包括:事件类型、改变了的值、事件期间任何单击的鼠标按钮等等。 事件通常由系统生成,但是事件类提供创建事件对象的公共构造方法,可以使用事件生命周期的处理方法来分派这些用户生成的事件。 事件类构架可用于创建用户定义的事件的出发点。,2020/8/2,Java面向对象程序设

27、计教程,40,Java事件的分类,低层事件 就是那些任何组件类型都能生成的事件。低层事件的例子可以是键盘或鼠标事件。从组件维护的监听器列表添加或删除低层监听器的方法(addXXXListencr和removeXXXListener方法)定义在Component和JComponent类内。 高层事件(或者说语义事件) 是组件特定的事件。高层事件只由GUI组件的一小部分子集生成。例如,只有实现Adjustable接口的组件,比如JScrollBar,才能生成AdjustmentEvent对象。从事件源监听器列表添加或删除高层事件监听器的方法一般定义在生成事件的类内。例如,JButton能够生成ActionEvent对象。addActionListener和removeActionListener方法定义在JButton类内。,2020/8/2,Java面向对象程序设计教程,41,通常使用的事件监听器接口及其方法,2020/8/2,Java面向对象程序设计教程,42,常用的事件、事件监听器及其支持的事件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论