




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020年1月5日星期日 第5章图形用户界面设计与事件处理 2020年1月5日星期日 5 1图形用户界面概述 为了方便开发图形用户界面 GraphicsUserInterface GUI Java提供了AWT AbstractWindowToolkit 抽象窗口工具包 和Swing两个图形用户界面工具包 以生成各种标准图形界面元素和处理图形界面的各种事件 有效地实现图形用户界面的跨平台移植 2020年1月5日星期日 AWT AWT把用户界面元素的创建和操作交给每个目标平台 Windows Solaris Macintosh等 上的本地GUI工具箱来处理 即对AWT包中的每一个组件都引入一个具有本地平台显示风格的图形用户界面组件 对等组件 当程序运行时系统将自动创建一个AWT组件的对等组件 由它来负责执行该组件在本地的显示和管理工作 使得界面具有本地平台显示风格 L F 但是AWT非常依赖于运行时平台的本地用户界面组件 产生的图形用户接口在不同的平台上存在着不同的bug 并且不能完全确保本地平台显示风格 而且它还限制访问操作系统中现有的高级GUI元素 2020年1月5日星期日 Swing 1997年Sun公司同Netscape公司通力合作创建了新的图形用户界面库取名Swing Swing与AWT的最大区别是 Swing组件的实现没有采用任何本地代码 完全由Java语言实现 具有平台独立的API并且具有平台独立的实现 因此Swing组件不再受各种平台显示特征的限制 真正实现了Sun公司的 一次编写 到处运行 的目标 Swing包是在AWT包的基础上创建的 但Swing组件的先进性并不代表着能够完全取代AWT组件 AWT的模式在很大的程度上影响Swing的模式 甚至某些机制是一致的 如AWT中的事件处理机制 在Swing中仍然使用 因此在学习Swing的同时 了解AWT是非常必要的 2020年1月5日星期日 5 2AWT及其组件 Java基础类 JFC 主要包括五个API AWT Java2D Accesssibility Drag Drop和Swing 它提供了帮助开发人员设计复杂应用程序的一整套应用程序开发包 其中 AWT组件为各类Java应用程序提供了许多GUI工具 2020年1月5日星期日 5 2 1java awt包 AWT是使用Java进行GUI设计的基础 AWT包中包含了很多支持图形用户界面的类与接口 各类中封装了大量的方法 以方便用户进行图形用户界面的设计 这些类与接口的主要功能包括 用户界面组件 事件处理模型 图形和图像工具 包括形状 颜色和字体类 布局管理器 可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关 数据传送类 可以通过本地平台的剪贴板来进行剪切和粘贴 AWT包中主要类及其层次关系如图5 1所示 2020年1月5日星期日 图5 1AWT的类层次结构 2020年1月5日星期日 AWT的类 1 AWTEvent类AWTEvent类是JDK1 1中所有AWT事件的父类 它是一个抽象类 其中定义了AWT事件的一般模型和接口 在实际使用时不能直接使用这个类 2 Font类用来表示字体的类 通过它可以在GUI中使用多种系统支持的字体 2020年1月5日星期日 AWT的类 续一 3 Component类 组件类 Component类是一个抽象类 它是构成Java图形用户界面的基础 大多数组件都是它的子类或间接子类 其中封装了组件通用的方法和属性 如图形的组件对象 大小 显示位置 前景色和背景色 边界 可见性等 因此许多组件类也就继承了Component类的成员方法和成员变量 相应的成员方法包括getComponentAt intx inty getFont getForeground getName getSize paint Graphicsg repaint update Graphicsg setVisible booleanb setSize Dimensiond setName Stringname 等 4 Container类 容器类 容器Container类是Component类的一个子类 因此容器本身也是一个组件 具有组件的所有性质 但它的主要功能是容纳其他组件和容器 2020年1月5日星期日 AWT的类 续二 5 Graphics类Graphics类是所有用来在组件上进行图形绘制时所用的图形上下文的父类 它提供了对组件进行图形绘制的一般方法的接口 一个Graphics对象中封装了用来进行图形绘制时必需的状态信息 包括 要绘制的组件对象 当前颜色 当前字体 当前逻辑点的操作功能 当前XOR方式的替代颜色 6 布局管理器类FlowLayout BorderLayout GridLayout CardLayout GridBagLayout是布局管理器类 布局管理器是Java语言中提供专门用来管理组件在容器中布局的工具 它负责组件在容器中的位置 大小等布局的管理 使用不同的布局管理器 组件在容器中的位置布局不同 2020年1月5日星期日 5 2 2组件 组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象 是GUI的基本组成元素 组成GUI的组件 如按钮 Button 标签 Label 等 不能独立显示 必须通过add 方法将组件放在容器中才能显示出来 表5 1列出了AWT中的基本组件 2020年1月5日星期日 表5 1AWT中的基本组件 2020年1月5日星期日 5 2 3容器 容器Container类是Component抽象类的一个子类 一个容器可以容纳多个组件 并使它们成为一个整体 容器的主要功能是容纳其他组件和容器 简化图形化界面的设计 以整体结构来布置界面 所有的容器都可以通过add 方法向容器中添加组件 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 方法来设置背景色 例 FrameDemo java 2020年1月5日星期日 2 Panel Panel 面板 是一块无边框的容器 不能单独显示 必须添加到Window或Frame中 Panel面板中可以放入基本组件 它是Applet的父类 2020年1月5日星期日 常见控件类 1 标签Label Stringstr setText Stringstr getText 例 LabelDemo java 2020年1月5日星期日 2 按钮 Button Stringstr getLabel setLabel Stringstr 例 ButtonDemo java 2020年1月5日星期日 3 文本框 TextField Stringstr TextField intnumChars TextField Stringstr intnumChars setText Stringstr setEditable booleancanEdit setEchoChar charch 例 TextDemo java 2020年1月5日星期日 4 复选框 Checkbox Stringstr Checkbox Stringstr booleanon getState setState booleanon 例 CheckboxDemo java 2020年1月5日星期日 5 下列列表框 add Stringname getItem intindex getItemCount select intindex getSelectedItem getSelectedIndex 例 ChoiceDemo java 2020年1月5日星期日 6 列表框 List List introws List introws booleanmultipleMode add Stringname add Stringname intindex getSelectedItem getSelectedIndex getItem intindex getItemCount select intindex 例 ListDemo java 2020年1月5日星期日 7 单选框 单选框与复选框有相似之处 同样有Checkbox类来创建 不同的是单选框所对应的Checkbox类对象属于某个选择框组 即是一个CheckboxGroup类对象 Checkbox Stringstr CheckboxGroupcbGroupbooleanon setCheckboxGroup CheckboxGroupcbGroup 设置选择框所属的选择框组 2020年1月5日星期日 5 2布局管理器 布局管理器决定容器的布局策略及容器内组件的排列顺序 组件大小与位置 以及当窗口移动或调整大小后组件如何变化等 每一种布局管理器对应一种布局策略 每个容器一般都有默认的布局管理器 该布局管理器可以通过setLayout 改变 当然 在需要人工排列或布局组件时 也可以使用setLayout null 方法取消所有的布局方式 由用户自行安排组件的合适位置 java awt包中共定义了五种布局管理器 分别为FlowLayout BorderLayout GridLayout CardLayout GridBagLayout 它们都是java lang Object类的直接子类 2020年1月5日星期日 5 2 1FlowLayout布局管理器 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日星期日 5 2 1FlowLayout布局管理器 续一 3 FlowLayout intalign inthgap intvgap 组件按参数指定的对齐方式摆放 组件之间的水平间距由hgap参数指定 垂直间距由vgap参数指定 间距单位为像素 对于一个容器 可以使用下面的语句设定其布局管理器为FlowLayout setLayout newFlowLayout 对于使用FlowLayout的容器 可用下面的语句来添加组件 add 组件名 例 FlowLayoutDemo java 2020年1月5日星期日 图5 3FlowLayout示例 a 运行结果 b 改变窗口大小后组件的布局 2020年1月5日星期日 5 2 2GridLayout布局管理器 GridLayout布局管理器把容器的空间划分为若干行 列的网格区域 而每个组件按添加的顺序从左向右 从上向下地占据这些网格 GridLayout的构造方法有三个 GridLayout 容器划分为一行 一列的网格 GridLayout introws intcols 容器划分为指定行 列数目的网格 注意当参数rows取0时 意味着任意数目的行 当参数cols取0时 意味着任意数目的列 2020年1月5日星期日 5 2 2GridLayout布局管理器 续一 GridLayout introws intcols inthgap intvgap 容器划分为指定行 列数目的网格 并且指定组件间的水平与垂直间隙 同样当参数rows取0时 意味着任意数目的行 参数cols取0时 意味任意数目的列 例 GridEx java 2020年1月5日星期日 5 2 4BorderLayout布局管理器 BorderLayout是Window Frame和Dialog的缺省布局管理器 BorderLayout布局管理器把容器分成5个区域 North South East West和Center 各个区域的位置如图5 4所示BorderLayout的构造方法有两个 分别是 1 BorderLayout 组件之间没有水平间隙与垂直间隙 2 BorderLayout inthgap intvgap 指定各组件之间的水平间隙和垂直间隙 图5 4BorderLayout示意图 2020年1月5日星期日 5 2 4BorderLayout布局管理器 续一 每向容器中添加一个组件都应该指明把这个组件放到哪个区域 否则组件将不能显示 我们可以调用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 分别对应 East West South North Center 2020年1月5日星期日 5 2 4BorderLayout布局管理器 续二 注意 当显示窗口被用户改变时 容器中组件会根据最佳尺寸做适当的调整 BorderLayout仅指定了五个区域的位置 如果容器中需要加入的组件超过五个 就必须使用容器的嵌套或改用其他的布局策略 若没有设置组件的相关位置 BorderLayout将以Center作为默认值 当两个组件被安排在相同的位置时 将出现位置错误 但系统不给予提示 例 BorderLayoutDemo java 2020年1月5日星期日 图5 5BorderLayout示例 a 运行结果 b 改变窗口大小后组件的布局 2020年1月5日星期日 5 2 5CardLayout布局管理器 CardLayout可以使两个或更多的组件共享同一显示空间 实际上同一时刻容器只能从这些组件中选出一个来显示 就像一系列卡片叠放 每次只能显示最上面的一张 CardLayout的构造方法 CardLayout 没有左右与上下边界间隙 CardLayout inthgap intvgap 参数hgap vgap指定组件距离左右 上下边界的间隙 CardLayout的常用方法 publicvoidfirst Containerparent 显示第一张卡片publicvoidnext Containerparent 显示下一张卡片 如果当前卡片是最后一张 则显示第一张 2020年1月5日星期日 5 2 5CardLayout布局管理器 续一 publicvoidprevious Containerparent 显示前一张卡片publicvoidlast Containerparent 显示最后一张卡片publicvoidshow Containerparent Stringname 显示指定名称的组件当向一个设置为CardLayout布局管理器的容器中添加组件时 必须使用Container类的如下方法 publicComponentadd Stringname Componentcomp 其中参数name可以是任意的字符串 它可以标识被添加的组件comp 例 CardLayoutDemo java 2020年1月5日星期日 5 2 3GridBagLayout布局管理器 GridBagLayout布局管理器是最灵活 最复杂的布局管理器 它是在GridLayout的基础上发展而来 但它不需要组件的尺寸大小一致 每个组件可以占有一个或多个网格单元 所占有的网格单元称为组件的显示区域 组件也可以按任意顺序添加到容器的任意位置 从而真正实现了自由地安排容器中的每个组件的大小和位置 为了使用GridBagLayout布局管理器 必须构造一个GridBagConstraints对象 这个对象指定了组件显示的区域在网格中的位置 以及应该如何摆放组件 它通过设置下列GridBagConstraints的变量来实现 2020年1月5日星期日 使用GridBagLayout的容器中常见的代码 GridBagLayoutgbl newGridBagLayout GridBagConstraintsgbc newGridBagConstraints setLayout gbl 创建组件 设置GridBagConstraints实例中的实例变量 Gbl setConstraints 组件 gbc add 组件 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日星期日 5 3事件处理 Java的图形用户界面中 每当用户执行一个操作 如按下一个按钮 移动鼠标 选择一项菜单 点击一个图标等 都会触发一个对用户有影响的事件 应用程序一旦检测到这个事件 就根据事件的类型 调用相对应的事件处理方法对事件进行处理 2020年1月5日星期日 5 3 1事件处理机制 从JDK1 1及以上版本 采用了一种新的事件处理机制 称为委托方式或监听器方式 在这种方式下 Java定义了许多不同的事件类 用来描述不同种类的事件 如描述按钮 文本域和菜单等组件动作的ActionEvent类 每一个可以触发事件的组件都被当做事件源 不同的事件源触发事件的种类不同 一个事件源可以触发多种事件 接收 控制和处理由事件源所触发事件的对象叫做监听器 每一种事件都对应专门的监听器 在委托方式事件处理模型中 需要事件源事先注册一个或多个监听器 当界面操作事件产生时 由于事件源本身不处理事件 该组件将把事件发送给能接收和处理该事件的监听器 委托相应的事件监听器来处理 2020年1月5日星期日 事件事件源监听器 实现接口 ActionEvent按钮ActionListener常见方法 1 实现监听器接口2 事件适配器 匿名类 2020年1月5日星期日 5 3 1事件处理机制 监听器是委托方式事件处理机制的重要组成部分 在Java中每类事件都定义了一个相应的监听器接口 该接口定义了接收和处理事件的方法 实现该接口的类 其对象可作为监听器注册 在图形用户界面中 需要响应用户操作的相关组件要注册一个或多个相应事件的监听器 该监听器中包含了能接收和处理事件的方法 在该类事件产生时 事件对象只向已注册的监听器报告 因此 委托方式的事件处理机制的实现包括下列两部分 2020年1月5日星期日 1 定义监听器类 实现监听器接口 对于某种类型的事件XXXEvent 要想接收并处理这类事件 必须定义相应的事件监听器类 该类需要实现与该事件相对应的接口XXXListener 如 publicclassMyClassimplementsActionListener ActionListener接口中只定义了一个方法 publicvoidactionPerformed ActionEvente 响应某个动作的代码 则Myclass将成为处理ActionEvent事件的监听器类 它的对象可以作为Button等组件的监听器注册 2020年1月5日星期日 2 注册监听器 通过调用组件的addXXXListener 的方法 在组件上将监听器类的实例注册为监听器 如 someComponent addActionListener newMyClass P137 例5 10 委托方式事件处理机制示例 例5 10的运行结果 2020年1月5日星期日 在例5 10中 创建Button对象时 这个对象可以通过addActionListener方法注册为ActionEvents的监听器 程序运行后 单击按钮 系统将调用监听器的actionPerformed 方法 显示字符串 事件发生 2020年1月5日星期日 5 3 2AWT事件类与监听器接口 在Java中 定义了许多事件类和监听器接口 在java util包中定义了一个事件类EventObject 所有具体的AWT事件类都位于java awt event包中 并且继承EventObject类 事件类的层次结构如图所示 图AWT事件类的层次结构图 2020年1月5日星期日 对于每种类型的事件都有一个相应监听器接口 监听器接口中定义了一个或多个处理事件的方法 实现监听器接口的类 其对象就可以作为接收并处理相应事件的监听器 每当特定的事件发生时 AWT会决定调用相应的方法来处理 表5 2列出AWT事件类 对应的监听器接口与适配器类 以及监听器接口中所包含的方法 2020年1月5日星期日 表5 2事件与相应的监听器接口 方法 适配器 2020年1月5日星期日 表5 3组件及其可触发的事件类型 2020年1月5日星期日 5 3 3事件处理方式 每个具体的事件都是某种事件类的实例 每个事件类对应一个事
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学生自我管理能力对学习动机的影响
- 医疗培训中激发学习动力的方法论
- 创新教育模式以教育心理学为基础的课程设计
- 创新教育政策塑造未来人才的关键
- 从神经科学的角度探讨提升学生参与度的方法
- 潜能激发教育心理学的实践路径
- 抖音商户直播前预热活动规划制度
- 22-富深木工胶!一文带你看懂手工贴木皮开裂原因及解决办法
- 公交优先政策与城市交通拥堵治理:2025年交通拥堵治理技术装备发展报告
- 江西中医药大学《细胞生物学与医学遗传学》2023-2024学年第一学期期末试卷
- 借款合同模版
- 2025年高考全国一卷数学真题-答案
- 义务教育英语课程标准(2022年版)
- 企业异地作业管理制度
- 蛇咬伤的急救处理措施
- 2025至2030年中国硫酸钙晶须行业市场竞争现状及投资前景研判报告
- 2025至2030年中国榴莲行业发展模式分析及投资趋势预测报告
- 2025至2030年中国间规聚苯乙烯(SPS)行业市场全景调查及竞争战略分析报告
- 食品业务员合同范本
- 红十字会人体器官捐献流程
- 无菌检查操作规程
评论
0/150
提交评论