第5章 用户图形界面设计.ppt_第1页
第5章 用户图形界面设计.ppt_第2页
第5章 用户图形界面设计.ppt_第3页
第5章 用户图形界面设计.ppt_第4页
第5章 用户图形界面设计.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

2020年1月5日星期日 第5章用户图形界面设计 2020年1月5日星期日 目的要求 1 掌握AWT及其组件 AWT布局管理器 AWT事件处理机制 2 掌握Swing的特性及其类层次结构 Swing程序的一般结构 布局管理器与事件处理 3 掌握Swing常用容器组件和基本组件及其应用 2020年1月5日星期日 5 1图形用户界面概述 为了方便开发图形用户界面 GraphicsUserInterface GUI Java提供了AWT AbstractWindowToolkit 抽象窗口工具包 和Swing两个图形用户界面工具包 以生成各种标准图形界面元素和处理图形界面的各种事件 有效地实现图形用户界面的跨平台移植 2020年1月5日星期日 AWT AWT是Sun公司在发布JDK1 0时一个重要的组成部分 是Java提供的用来建立和设置Java的图形用户界面的基本工具 AWT中的所有工具类都保存在java awt包中 此包中的所有操作类可用来建立与平台无关的图形用户界面 GUI 的类 这些类又被称为组件 Components 2020年1月5日星期日 5 1AWT及其组件 AWT组件为各类Java应用程序提供了许多GUI工具 一 java awt包 AWT包中包含了很多支持图形用户界面的类与接口 各类中封装了大量的方法 以方便用户进行图形用户界面的设计 AWT包中主要类及其层次关系如图6 1所示 2020年1月5日星期日 图5 1AWT的类层次结构 2020年1月5日星期日 AWT的类 1 AWTEvent类 是所有AWT事件的父类 是一个抽象类 定义了AWT事件的一般模型和接口 不能直接使用这个类 2 Font类 表示字体的类 通过它可以使用多种系统支持的字体 3 Component类 是一个抽象类 大多数组件都是它的子类或间接子类 其中封装了组件通用的方法和属性 如图形的组件对象 大小 显示位置 前景色和背景色 边界 可见性等 4 Container类 容器Container类是Component类的一个子类 因此容器本身也是一个组件 具有组件的所有性质 但它的主要功能是容纳其他组件和容器 5 Graphics类 是所有用来在组件上进行图形绘制时所用的图形上下文的父类 它提供了对组件进行图形绘制的一般方法的接口 一个Graphics对象中封装了用来进行图形绘制时必需的状态信息 6 布局管理器类 FlowLayout BorderLayout GridLayout CardLayout GridBagLayout是布局管理器类 它负责组件在容器中的位置 大小等布局的管理 使用不同的布局管理器 组件在容器中的位置布局不同 2020年1月5日星期日 二 组件 组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象 是GUI的基本组成元素 组成GUI的组件 如按钮 Button 标签 Label 等 不能独立显示 必须通过add 方法将组件放在容器中才能显示出来 表6 1列出了AWT中的基本组件 2020年1月5日星期日 表5 1AWT中的基本组件 2020年1月5日星期日 三 容器 AWT提供了三种类型的容器 Window Panel ScrollPane 常用的有Panel Frame Applet Window类是用来创建不包含其他对象的顶层窗口 其对象直接位于桌面上 要生成一个窗口 通常是创建Window的子类Frame的对象 而不直接创建Window对象 Applet类应用于Applet小程序 在第7章再详细介绍 下面简单介绍一下Frame类与Panel类 2020年1月5日星期日 1 Frame 在Java中 每一个GUI应用程序都必须至少有一个顶层窗口 顶层窗口也称为框架 在AWT中 对应的框架类是Frame 它是Window类的子类 用来创建带有标题 菜单的全功能窗口 Frame常用的构造方法有 Frame 该方法用于创建一个不带标题的框架 Frame Stringtitle 该方法用于创建一个带有指定标题的框架这两个方法创建的窗口默认初始大小为 0 0 并且不可见 默认背景色为白色 为了使窗口显示出来 可调用其父类Component的方法setSize intwidth intheight 来设置其大小 调用setVisible Booleanb 方法将其设为可见 调用setBackground Colorc 方法来设置背景色 setResizable booleanb 是否可调大小setIconImage Imagem 设置窗口图标pack 以紧凑方式显示setMenuBar MenuBarm 设置菜单 例5 1 第一个窗口程序程序清单 FirstWindow java 例5 2 第一个完整窗口程序程序清单 window java 2020年1月5日星期日 2020年1月5日星期日 2 Panel Panel 面板 是一块无边框的容器 不能单独显示 必须添加到Window或Frame中 Panel面板中可以放入基本组件 它是Applet的父类 例5 3 Panel容器示例程序清单 FirstPanel java和index html 图6 2例6 1运行结果 2020年1月5日星期日 5 2布局管理器 布局管理器决定容器的布局策略及容器内组件的排列顺序 组件大小与位置 以及当窗口移动或调整大小后组件如何变化等 每一种布局管理器对应一种布局策略 每个容器一般都有默认的布局管理器 该布局管理器可以通过setLayout 改变 当然 在需要人工排列或布局组件时 也可以使用setLayout null 方法取消所有的布局方式 由用户自行安排组件的合适位置 java awt包中共定义了五种布局管理器 分别为FlowLayout BorderLayout GridLayout CardLayout GridBagLayout 它们都是java lang Object类的直接子类 2020年1月5日星期日 一 FlowLayout布局管理器 FlowLayout是Panel和Applet的默认布局管理器 容器内组件的放置规律是从左到右 从上到下逐行摆放 当组件不多时 使用这种策略非常方便 但是当容器内的GUI组件增加时 就显得高低参差不齐 FlowLayout的构造方法有三个 分别是 1 FlowLayout 组件居中摆放 组件之间水平和垂直间距为5个像素 2 FlowLayout intalign 组件按参数指定的对齐方式摆放 组件之间水平和垂直间距为5个像素 参数align的取值必须是FlowLayout LEFT FlowLayout RIGHT或FlowLayout CENTER 它们是FlowLayout类中定义的三个publicstaticfinal类型的整型常量 其取值分别为 FlowLayout LEFT 0 FlowLayout RIGHT 1 FlowLayout CENTER 2 2020年1月5日星期日 一 FlowLayout布局管理器 续一 3 FlowLayout intalign inthgap intvgap 组件按参数指定的对齐方式摆放 组件之间的水平间距由hgap参数指定 垂直间距由vgap参数指定 间距单位为像素 对于一个容器 可以使用下面的语句设定其布局管理器为FlowLayout setLayout newFlowLayout 对于使用FlowLayout的容器 可用下面的语句来添加组件 add 组件名 例5 4 FlowLayout布局管理器应用示例 程序例5 4 FlowLayoutTest java 2020年1月5日星期日 图6 3FlowLayout示例 a 例6 2的运行结果 b 改变窗口大小后组件的布局 2020年1月5日星期日 二 BorderLayout布局管理器 BorderLayout是Window Frame和Dialog的缺省布局管理器 BorderLayout布局管理器把容器分成5个区域 North South East West和Center 各个区域的位置如图6 4所示BorderLayout的构造方法有两个 分别是 1 BorderLayout 组件之间没有水平间隙与垂直间隙 2 BorderLayout inthgap intvgap 指定各组件之间的水平间隙和垂直间隙 图6 4BorderLayout示意图 2020年1月5日星期日 二 BorderLayout布局管理器 续一 每向容器中添加一个组件都应该指明把这个组件放到哪个区域 否则组件将不能显示 我们可以调用Container类的下列add 方法来添加组件并指定其方位 publicComponentadd Stringname Componentcomp 参数name指定方位publicvoidadd Componentcomp Objectconstraints 参数constraints指定方位在BorderLayout类中 定义了5个表示方位的publicstaticfinalString类型的常量 BorderLayout EAST BorderLayout WEST BorderLayout SOUTH BorderLayout NORTH BorderLayout CENTER 或 East West South North Center 2020年1月5日星期日 二 BorderLayout布局管理器 续二 注意 当显示窗口被用户改变时 容器中组件会根据最佳尺寸做适当的调整 BorderLayout仅指定了五个区域的位置 如果容器中需要加入的组件超过五个 就必须使用容器的嵌套或改用其他的布局策略 若没有设置组件的相关位置 BorderLayout将以Center作为默认值 当两个组件被安排在相同的位置时 将出现位置错误 但系统不给予提示 例5 5 BorderLayout布局管理器应用示例 程序清单 BorderLayoutTest java 2020年1月5日星期日 图6 5BorderLayout示例 a 例6 3运行结果 b 改变窗口大小后组件的布局 2020年1月5日星期日 三 GridLayout布局管理器 GridLayout布局管理器把容器的空间划分为若干行 列的网格区域 而每个组件按添加的顺序从左向右 从上向下地占据这些网格 GridLayout的构造方法有三个 GridLayout 容器划分为一行 一列的网格 GridLayout introws intcols 容器划分为指定行 列数目的网格 注意当参数rows取0时 意味着任意数目的行 当参数cols取0时 意味着任意数目的列 2020年1月5日星期日 三 GridLayout布局管理器 续一 GridLayout introws intcols inthgap intvgap 容器划分为指定行 列数目的网格 并且指定组件间的水平与垂直间隙 同样当参数rows取0时 意味着任意数目的行 参数cols取0时 意味任意数目的列 例5 7 GridLayout布局管理器应用示例 程序清单 GridLayoutTest java a 例6 4运行结果 b 改变窗口大小后组件的布局 2020年1月5日星期日 四 CardLayout布局管理器 CardLayout可以使两个或更多的组件共享同一显示空间 实际上同一时刻容器只能从这些组件中选出一个来显示 就像一系列卡片叠放 每次只能显示最上面的一张 CardLayout的构造方法 CardLayout 没有左右与上下边界间隙 CardLayout inthgap intvgap 参数hgap vgap指定组件距离左右 上下边界的间隙 CardLayout的常用方法 publicvoidfirst Containerparent 显示第一张卡片publicvoidnext Containerparent 显示下一张卡片 如果当前卡片是最后一张 则显示第一张 2020年1月5日星期日 四 CardLayout布局管理器 续一 publicvoidprevious Containerparent 显示前一张卡片publicvoidlast Containerparent 显示最后一张卡片publicvoidshow Containerparent Stringname 显示指定名称的组件当向一个设置为CardLayout布局管理器的容器中添加组件时 必须使用Container类的如下方法 publicComponentadd Stringname Componentcomp 其中参数name可以是任意的字符串 它可以标识被添加的组件comp 2020年1月5日星期日 四 CardLayout布局管理器 续二 例5 6 CardLayout布局管理器应用示例 程序清单 CardLayoutTest java a 例6 5运行结果 b 单击 卡片切换 按钮后运行结果 图6 7CardLayout示例 2020年1月5日星期日 五 GridBagLayout布局管理器 GridBagLayout布局管理器是最灵活 最复杂的布局管理器 它是在GridLayout的基础上发展而来 但它不需要组件的尺寸大小一致 每个组件可以占有一个或多个网格单元 所占有的网格单元称为组件的显示区域 组件也可以按任意顺序添加到容器的任意位置 从而真正实现了自由地安排容器中的每个组件的大小和位置 为了使用GridBagLayout布局管理器 必须构造一个GridBagConstraints对象 这个对象指定了组件显示的区域在网格中的位置 以及应该如何摆放组件 它通过设置下列GridBagConstraints的变量来实现 2020年1月5日星期日 GridBagConstraints的成员变量 gridx gridy 指定组件左上角在网格中的行与列 容器中最左边列的gridx 0 最上边行的gridy 0 这两个变量的默认值为GridBagConstraints RELATIVE 表示对应的组件将放在前面放置组件的右边或下面 gridwidth gridheight 指定组件显示区域所占的列数与行数 以网格单元而不是以像素为单位 默认值为1 GridBagConstraints REMAINDER指定组件是所在行或列的最后一个组件 GridBagConstraints RELATIVE指定组件是所在行或列的倒数第二个组件 2020年1月5日星期日 GridBagConstraints的成员变量 续一 fill 指定组件填充网格的方式 它可以是如下的值 GridBagConstraints NONE 默认值 组件的大小不改变 GridBagConstraints HORIZONTAL 组件横向充满显示区域 但不改变组件的高度 GridBagConstraints VERTICAL 组件纵向充满显示区域 但不改变组件的宽度 GridBagConstraints BOTH 组件横向 纵向充满其显示区域 ipadx ipady 指定组件显示区域的内部填充 即在组件最小尺寸之外需要附加的像素数 默认值为0 因此 组件的宽度最少是它的最小宽度加上ipadx 2 组件的高度最少是它的最小高度加上ipady 2 2020年1月5日星期日 GridBagConstraints的成员变量 续二 insets 指定组件显示区域的外部填充 即组件与其显示区域边缘之间的空间 默认时 组件没有外部填充 anchor 指定组件在显示区域中的摆放位置 其值可为 GridBagConstraints CENTER 默认值 GridBagConstraints NORTHGridBagConstraints NORTHEASTGridBagConstraints EASTGridBagConstraints SOUTHEASTGridBagConstraints SOUTHGridBagConstraints SOUTHWESTGridBagConstraints WESTGridBagConstraints NORTHWEST 2020年1月5日星期日 GridBagConstraints的成员变量 续三 weightx weighty 用来指定在容器大小改变时 增加或减少的空间如何在组件间分配 默认值是0 即所有的组件将聚拢在容器的中心 多余的空间将放在容器边缘与网格单元之间 每一列组件的weightx值指定为该列组件的weightx的最大值 每一行组件的weighty值指定为该行组件的weighty的最大值 weightx和weighty的取值一般在0 0 1 0之间 数值大表明组件所在的行或列将获得更多的空间 2020年1月5日星期日 五 GridBagLayout布局管理器 例5 8 GridBagLayout布局管理器应用示例 程序清单 GridBagLayoutTest java a 例6 6运行结果 b 改变窗口大小后组件的布局 图6 8GridBagLayout示例 2020年1月5日星期日 5 3事件处理 Java的图形用户界面中 每当用户执行一个操作 如按下一个按钮 移动鼠标 选择一项菜单 点击一个图标等 都会触发一个对用户有影响的事件 应用程序一旦检测到这个事件 就根据事件的类型 调用相对应的事件处理方法对事件进行处理 2020年1月5日星期日 一 事件处理机制 JDK1 0的事件处理采用基于层次模型的向上传递机制 这种模型中 当事件发生时首先将事件发送给产生事件的组件 如果该组件不对事件进行处理 则事件将自动传递到包含该组件的容器 因此事件将沿着组件间的包含关系层层向上传递 由于这种层层向上传递 一些无关或不重要的事件也会一层层地向上传递 会使得CPU浪费在处理一些无关的事件上 而且为了处理事件 程序员必须继承事件源组件对应的类或在它的容器中编写一个功能很强大的事件处理方法 因此这种方式并不能很好地满足系统开发的需要 2020年1月5日星期日 一 事件处理机制 续一 从JDK1 1及以上版本 采用了一种新的事件处理机制 称为委托方式或监听器方式 在这种方式下 Java定义了许多不同的事件类 用来描述不同种类的事件 如描述按钮 文本域和菜单等组件动作的ActionEvent类 每一个可以触发事件的组件都被当做事件源 不同的事件源触发事件的种类不同 一个事件源可以触发多种事件 接收 控制和处理由事件源所触发事件的对象叫做监听器 每一种事件都对应专门的监听器 在委托方式事件处理模型中 需要事件源事先注册一个或多个监听器 当界面操作事件产生时 由于事件源本身不处理事件 该组件将把事件发送给能接收和处理该事件的监听器 委托相应的事件监听器来处理 2020年1月5日星期日 一 事件处理机制 续二 监听器是委托方式事件处理机制的重要组成部分 在Java中每类事件都定义了一个相应的监听器接口 该接口定义了接收和处理事件的方法 实现该接口的类 其对象可作为监听器注册 在图形用户界面中 需要响应用户操作的相关组件要注册一个或多个相应事件的监听器 该监听器中包含了能接收和处理事件的方法 在该类事件产生时 事件对象只向已注册的监听器报告 因此 委托方式的事件处理机制的实现包括下列两部分 2020年1月5日星期日 1 定义监听器类 实现监听器接口 对于某种类型的事件XXXEvent 要想接收并处理这类事件 必须定义相应的事件监听器类 该类需要实现与该事件相对应的接口XXXListener 如 publicclassMyClassimplementsActionListener ActionListener接口中只定义了一个方法 publicvoidactionPerformed ActionEvente 响应某个动作的代码 则Myclass将成为处理ActionEvent事件的监听器类 它的对象可以作为Button等组件的监听器注册 2020年1月5日星期日 2 注册监听器 通过调用组件的addXXXListener 的方法 在组件上将监听器类的实例注册为监听器 如 someComponent addActionListener newMyClass P240 例6 7 委托方式事件处理机制示例 程序清单6 7 TestButton java 图6 9例6 7的运行结果 2020年1月5日星期日 在例6 7中 创建Button对象时 这个对象可以通过addActionListener方法注册为ActionEvents的监听器 程序运行后 单击按钮 系统将调用监听器的actionPerformed 方法 显示两行字符串 ActionoccurredButton slabelis PressMe 2020年1月5日星期日 二 AWT事件类与监听器接口 在Java中 定义了许多事件类和监听器接口 在java util包中定义了一个事件类EventObject 所有具体的AWT事件类都位于java awt event包中 并且继承EventObject类 事件类的层次结构如图6 10所示 图6 10AWT事件类的层次结构图 2020年1月5日星期日 对于每种类型的事件都有一个相应监听器接口 监听器接口中定义了一个或多个处理事件的方法 实现监听器接口的类 其对象就可以作为接收并处理相应事件的监听器 每当特定的事件发生时 AWT会决定调用相应的方法来处理 表6 2列出AWT事件类 对应的监听器接口与适配器类 以及监听器接口中所包含的方法 2020年1月5日星期日 表6 2事件与相应的监听器接口 方法 适配器 2020年1月5日星期日 表6 3组件及其可触发的事件类型 2020年1月5日星期日 三 事件处理方式 每个具体的事件都是某种事件类的实例 每个事件类对应一个事件监听器接口 如ActionEvent对应ActionListener MouseEvent对应MouseListener 同时Java为每个包含两个或两个以上方法的监听器接口提供了事件适配器 如果程序需要处理某种事件 就需要实现相应的事件监听器接口或创建适配器类的子类 常见的事件处理方式有以下几种方式 2020年1月5日星期日 三 事件处理方式 续一 1 用容器类或者定义专门的类来实现监听器接口由于Java支持一个类实现多个接口 因此最容易的方法是通过容器类实现监听器接口 容器中的组件将容器本身注册为监听器 也可以定义专门的类来实现监听器接口 这种方法可以使事件处理与创建GUI界面的代

温馨提示

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

评论

0/150

提交评论