Java编程续.pptx_第1页
Java编程续.pptx_第2页
Java编程续.pptx_第3页
Java编程续.pptx_第4页
Java编程续.pptx_第5页
已阅读5页,还剩382页未读 继续免费阅读

下载本文档

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

文档简介

第7章图形用户界面技术 图形用户界面技术 本节主要内容 概述AWT技术Swing技术 7 1概述 Java1 0推出时 只有一个针对基本GUI编程的类库 称为 AbstractWindowToolkit 抽象窗口工具包 简称为 AWT 在开发applet和图形应用程序时 一般需要用到AWT AWT的初始版本是为了在简单用户界面中开发applet程序而设计的 是免费Java开发工具包 JDK 的一部分 AWT的作用是给用户提供基本的界面组件 例如按钮 列表 菜单 文本域等等 AWT组件主要用来建立独立于平台图形用户界面 此外 AWT还提供事件处理 剪贴板支持 数据传输和图像操作等 随着2DAPI的出现 AWT还提供高级字体操作 打印 地理数据获取和输入方法等功能的软件包 7 1 1AWT体系结构 对等体是一种本地图形用户接口 GUI 组件 由AWT类管理 是JavaAWT采用的一种设计方案 图1表明了AWT的设计思路 AWTAPI允许所有的Java程序以安全和平台无关的方式来使用AWT组件进行图形用户界面的编程 而底层则交给AWT对等体来访问不同平台的本地组件 7 1 1AWT体系结构 图7 1AWT对等体结构 7 1 2重量组件和轻量组件 一个AWT组件通常是一个包含了对等体接口类引用的组件类 它指向本地对等体实现 因此 AWT组件全都是重量组件 都具有对等体 且在本地 不透明 窗口中进行显示 使用它们的代价较高 而且不能继承 此外 外形是矩形的 不能有透明的背景 无法进行装饰 对等体可以快速产生一个GUI工具组件 本地对等体做了更多的实际工作 而AWT类所做的仅仅是表面工作 因此 很容易开发 开发最初的AWT 只用了不到6个星期的时间 但这种效率带来的利益在很大程度上被一些不利因素抵消了 如基本的对等体结构 有限的事件模型以及对等体与AWT之间不匹配造成的缺陷等 7 1 2重量组件和轻量组件 Java的发展速度超出了人们的想象 AWT也成为了人们关注的焦点 由于其缺陷 第三方开始提供工具包 以提供更可靠的下层组件并提供比AWT更多的功能 这些工具包之一是Netscape的IFC InternetFoundationClasses Internet基础类 IFC是建立在NEXTSTEP中的用户界面工具包概念基础上的一组轻量类 IFC组件采用了和AWT不同是设计思路 在许多方面胜过了AWT组件 由于认识到Java领域很可能在标准用户界面工具包问题上出现分裂 Sun公司和Netscape公司达成了协议 共同实现JFC JavaFoundationClasses Java基础类 Apple和IBM也参加了JFC的开发 代码名是 Swing 7 1 2重量组件和轻量组件 今天 作为一个功能全面的用户界面工具包 Swing提供了AWT和IFC中最优秀的成份 AWT的窗口组件很大程度上被Swing工具包替代 Swing通过自己绘制窗口组件而避免了AWT的种种弊端 Swing调用本地图形子系统中的底层例程 而不是依赖操作系统的高层用户界面模块 轻量组件不同于重量组件 它没有本地对等体 在其所在的重量容器窗口中绘制 由于轻量组件不在本地不透明的窗口中绘制 因此 它们可以有透明的背景 这使得显示的轻量组件可以是非矩形的 7 1 2重量组件和轻量组件 Swing组件几乎都是轻量组件 顶层容器除外 如窗体 Applet 窗口和对话框等 因为轻量组件是在其容器的窗口中绘制的 而不是在自己的窗口中绘制的 所以轻量组件最终必须包含在一个重量容器中 因此 Swing的窗体 Applet 窗口和对话框都必须是重量组件 以便提供一个可以在其中绘制Swing轻量组件的容器 那么 是否就可以不用AWT了呢 当然不行 Swing只是提供了功能更强的用户界面组件 而AWT仍然是构成Swing的基础 7 1 3图形用户界面元素 构造图形用户界面 就是将一组图形界面元素有机地组合起来 各种界面元素功能不同 主要分为 容器 Container 控件和自定义元素三类 Container类是Component 组件 类的抽象子类 可以容纳其他的组件 容纳的组件不仅仅是控件 也可以是容器 这样就可以创建一个完整的层次结构 在屏幕上布置GUI组件 容器是很有用的 要想产生复杂的界面 必须使用容器进行布局嵌套 例如 Panel类是简单的Container类 Window类是另一个Container类 Panel类通常嵌入Window类中 然后再在Panel类中安排各种控件 以形成复杂布局的图形用户界面 7 1 3图形用户界面元素 控件不能包含其他的元素 其作用是完成与用户的一次交互 常见的控件有 Button Checkbox Choice Label List TextArea TextField等图形用户界面组件 除了标准的图形元素外 还可以根据需要设计自己的图形界面成分 例如绘制特定的几何图形 使用图案等 自定义的元素通常起装饰 美化的作用 7 1 4java awt包 AWT图形界面技术封装在java awt包中 它包含生成窗口部件和GUI组件的类 其基本结构如图2所示 7 1 4java awt包 图7 2java awt包的层次结构 7 1 5Swing体系结构 与AWT相比 Swing提供了更完整的组件 主要用来进行基于窗口的应用程序开发 引入了许多新的特性和能力 SwingAPI是围绕着实现AWT各个部分的API构筑的 这保证了所有早期的AWT组件仍然可以使用 AWT采用了与特定平台相关的实现 而绝大多数Swing组件却不是这么做的 图3显示了JFC各个部分之间的相互关系 Java2D 可访问性辅助API和拖放是不属于Swing的 因为这些组件使用了一些本地代码 而Swing却是纯Java的 7 1 5Swing体系结构 图7 3Swing体系结构 7 1 6javax swing包 Swing围绕着JComponent的组件构建 而JComponent则由AWT的Container继承得到的 图4说明了Swing组件的层次结构 7 1 6javax swing包 图7 4javax swing包的层次结构 7 2AWT Swing围绕着JComponent的组件构建 而JComponent则由AWT的Container继承得到的 图4说明了Swing组件的层次结构 7 2AWT Java的AWT图形用户界面技术主要包括以下特征 本地用户接口组件集 事件处理模型 图形和图像工具 包括形状 颜色和字体等 布局管理器 可创建不依赖于特定窗口尺寸或屏幕分辨率的 柔性的窗口布局 数据传输类 可使用本地平台的剪贴板进行剪切和复制 要进行AWT编程 就必须了解一些相关的基础知识 如窗口 组件 组件位置 组件大小 事件等 7 2 1容器 容器主要有两种类型 窗口和面板 窗口是java awt Window类的对象 窗口是显示屏上的特定区域 独立于其他容器 窗口有两种形式 Frame 窗体 类和Dialog 对话框 类 Frame和Dialog是Window类的子类 窗体是一个带有标题和缩放操作的窗口 对话框没有菜单条 能移动 但不能缩放 Frame类是Window的子类 属于java awt Container 可以用add 方法向窗体中添加组件 Frame的缺省布局管理器是BorderLayout 当然 可以用setLayout 方法来改变布局方式 后面会进行介绍 7 2 1容器 Frame类的构造方法Frame String 使用String指定的标题来创建一个新的不可见Frame对象 在它还处于不可见状态时 将所有组件添加到Frame对象中 最后再将其显示出来 MyFrame 图7 5简单的Frame窗口 7 2 1容器 面板是java awt Panel类的对象 可嵌入在其他容器中 或是在Web浏览器的窗口中 Panel指定一个四边形 其他的组件可以放入其中 Panel必须放在Window之中 或Window的子类中 才能显示出来 像Frame一样 Panel提供空间来容纳图形用户界面组件 包括其他面板 每个面板都可以有自己的布局管理器 一旦创建了一个Panel对象 要想看得见 必须将其添加到窗口或Frame对象中 使用Container类中的add 方法即可 FrameWithPanel 图7 6带有Panel的Frame窗口 7 2 2布局管理器 容器里的组件的位置和大小是由布局管理器决定的 当容器需要定位一个组件时 将调用布局管理器来进行处理 当确定组件大小时 同样如此 布局管理器完全控制容器内的所有组件 负责计算并定义上下文中对象在实际屏幕中所需的大小 Java中的布局管理器主要有 FlowLayout Panel和Applet缺省的布局管理器BorderLayout Window Dialog及Frame缺省的布局管理器GridLayoutCardLayoutGridBagLayout 7 2 2布局管理器 下面是使用布局管理器的典型示例 GUIExample 图7 7带有FlowLayout的窗口 7 2 2布局管理器 1 FlowLayoutFlowLayout逐行放置组件 每完成一行 一个新行便又开始 与其他布局管理器不同 FlowLayout布局管理器不限制其管理的组件的大小 而是允许它们有自己的最佳大小 当用户对由FlowLayout管理的区域进行缩放时 布局就发生变化 如图8所示 图7 8FlowLayout管理的窗口改变大小时的情形 7 2 2布局管理器 FlowLayout布局管理器有如下的构造方法 newFlowLayout newFlowLayout intalign newFlowLayout intalign inthgap intvgap FlowLayout构造方法参数align允许将组件左对齐 右对齐或居中对齐 缺省 值分别为三个常量 FlowLayout LEFT FlowLayout RIGHT或FlowLayout CENTER hgap可设置组件间的水平间隔 而vgap用来设置组件间的竖直间隔 缺省值都是5 下面是图8所示布局管理器的实现 将三个按钮添加到Frame中 并安装了FlowLayout布局管理器来管理Frame中的组件 MyFlowLayout 7 2 2布局管理器 2 BorderLayoutBorderLayout提供了更复杂的布局管理方案 它将容器分成五个区域 东 南 西 北 中 BorderLayout布局管理器是Dialog和Frame的缺省布局管理器 北占据面板的上方 东占据面板的右侧 等等 中间区域是在东 南 西 北都填满后剩下的区域 当窗口垂直延伸时 东 西 中区域也延伸 而当窗口水平延伸时 南 北 中区域也延伸 为了能观察到这种变化 在每个区域放置一个按钮 按钮将充满整个区域 当改变窗口大小时就会出现上面所描述的情形 如图9所示 图7 9BorderLayout管理的窗口改变大小时的情形 7 2 2布局管理器 BorderLayout布局管理器有如下的构造方法 newBorderLayout newBorderLayout inthgap intvgap 当BorderLayout构造方法不带参数时 BorderLayout在组件之间没有间隙 也可用第二个构造方法指定组件之间的间隙 在BorderLayout布局管理器中组件必须被添加到指定的区域 区域名拼写要正确 如 add button Center 或add button BorderLayout CENTER 下面的代码是图9所示布局管理器的实现 演示了BorderLayout布局管理器的特性 MyBorderLayout 7 2 2布局管理器 3 GridLayoutGridLayout布局管理器为放置组件提供了灵活性 用行和列来管理组件 将组件填充到指定的单元格 如 newGridLayout 3 2 创建一个三行两列的网格布局 能产生如图9所示的六个单元格 当改变窗口大小时 单元格会随窗口大小改变而缩放 图7 10GridLayout管理的窗口改变大小时的情形 7 2 2布局管理器 GridLayout布局管理器有如下的构造方法 newGridLayout newGridLayout introws intcols newGridLayout introws intcols inthgap intvgap GridLayout布局管理器不带参数的构造方法创建具有默认值的网格布局 即每个组件占据一行一列 带2个参数的构造方法创建具有指定行数和列数的网格布局 给布局中的所有组件分配相等的大小 带4个参数的构造方法创建具有指定行数和列数的网格布局 给布局中的所有组件分配相等的大小 此外 将水平和垂直间距设置为指定值 7 2 2布局管理器 使用add 方法可将组件添加到容器里 GridLayout布局管理器的组件添加的顺序是从上到下 自左至右 依次加入到网格里 下面的代码是图10所示布局管理器的实现 演示了GridLayout布局管理器的特性 MyGridLayout 7 2 2布局管理器 4 CardLayoutCardLayout布局管理器将界面看作一系列的卡片 其中的一个在任何时候都可见 用add 方法可将卡片添加到CardLayout布局中 CardLayout布局管理器的show 方法可在一系列卡片中转换 如图11所示 图7 11CardLayout管理的窗口每次只能看到一张卡片 7 2 2布局管理器 下面的代码是图11所示布局管理器的实现 演示了CardLayout布局管理器的特性 在Frame窗口对象中使用CardLayout布局管理器 放置了5张卡片 每张卡片放置一个Label标签 用以显示当前面板的情况 当点击鼠标时 使用CardLayout布局管理器的next 方法进行卡片的切换 图11所看到的结果是其操作过程中的两种情况 MyCardLayout 7 2 2布局管理器 5 GridBagLayoutGridBagLayout在网格布局的基础上提供更复杂的布局 它允许单个组件在一个单元格中而不是填满整个单元格 GridBagLayout布局管理器也允许单个组件占用不止一个单元格 GridBagLayout管理的行和列可以是大小不同的 GridLayout把每个组件限制到一个单元格 而GridBagLayout并不这样 组件在容器中可以占据任意大小的矩形区域 GridBagLayout通常由一个专用类来对其布局行为进行约束 该类叫GridBagConstraints 其中的所有成员都是public的 要学好如何使用GridBagLayout首先要了解有哪些约束变量 以及如何设置这些约束变量 7 2 2布局管理器 以下是GridBagConstraints的public成员变量 publicintanchor 当组件不能填满其格时 通过anchor来设置组件的位置publicintfill 当组件在其格内而不能撑满其格时 通过它来设定填充方式publicgridheight 组件所占行数 也是组件的高度publicgridweight 组件所占列数 也是组件的宽度publicgirdx 组件的横坐标publicgridy 组件的纵坐标publicInsetsinsets 当组件不能填满其格时 通过它来指定四周 即上下左右 所留空隙publicintipadx 组件间的横向间距publicintipady 组件间的纵向间距publicdoubleweightx 行的权重 通过这个属性来决定如何分配行的剩余空间publicdoubleweighty 列的权重 通过这个属性来决定如何分配列的剩余空间 7 2 2布局管理器 看起来有很多约束需要进行设置 但事实上许多约束只需设置一次 即可对后续组件发生作用 每次添加组件时只有少数的项需要修改 下面是一个具有简单约束的GridBagLayout示例 请注意注释屏蔽的语句 后面将介绍其影响 图12是程序的运行结果 图7 12GridBagLayout管理窗口的一种布局 MyGridBagLayout 7 2 2布局管理器 可能已经注意到图中的按钮 One 和按钮 Two 上下紧靠 这可以通过设置GridBagConstraints成员Insets来调整它周围的空间大小 c insets newInsets 4 4 4 4 其表现形式如图13所示 图7 13通过GridBagConstraints的Insets来调整布局 7 2 2布局管理器 当创建一个GridBagConstraints对象时 其fill值设置为NONE因此在单元格增长时 单元格内部组件不会增长 当文本框设置为HORIZONTAL时 它将随着窗口变宽而横向增长 如图14所示 图7 14通过GridBagConstraints的fill来调整布局 7 2 2布局管理器 ipadx和ipady两个属性 在GridBagLayout对容器进行布局时 它们把每个组件的最小尺寸作为如何分配空间的一个约束条件来考虑 如果一个按钮的最小尺寸是30象素宽 20象素高 而相关联的约束对象中 ipadx为4 ipady为2 那么按钮的最小尺寸将会成为横向38象素 纵向24象素 如图15所示 图7 15通过GridBagConstraints的ipadx和ipady来调整布局 7 2 2布局管理器 通过anchor属性来调整布局 将按钮 One 设置为NORTH 按钮 TWO 设置为WEST 其显示效果如图16所示 图7 16通过GridBagConstraints的anchor来调整布局 7 2 2布局管理器 6 创建复杂布局前面所介绍的布局管理器 不管多么复杂 都有其局限性 只使用一种布局管理球很难适应复杂的图形用户界面的需求 下面的程序将一个面板放置在BorderLayout布局的北部地区 并在其中放置两个按钮 这就形成了嵌套布局 这对复杂布局来说是基本的 ComplexLayout 图7 17通过容器嵌套形成的复杂布局 7 2 2布局管理器 如果缩放窗口 不同的布局管理器针对不同的部分起作用 看起来如图18所示 图7 18复杂布局的缩放效果 7 2 3AWT事件模型 事件是一个抽象的概念 是引起对象状态变化的对象 就是在一定的条件下发生的动作 描述对象发生了什么 在面向对象的程序设计中 事件消息是对象间通信的基本方式 在图形用户界面程序中 GUI组件对象根据用户的交互产生各种类型的事件消息 它们由应用程序的事件处理代码捕获 在进行相应的处理后驱动消息响应对象做出反应 事件在Java中和其他对象基本一样 不同的是 事件是由系统自动生成并自动传递到适当的事件处理程序 从而形成Java的事件驱动过程 事件类描述各种类型的用户交互 发出事件的对象称为事件源 对事件感兴趣的对象称为监听器 事件驱动就是事件源发出事件 监听器捕获事件并做出响应的过程 例如 如果用户执行了一个动作 鼠标点击和按键 将导致一个事件发生 接着会执行相应的动作 对发生的事件进行相应的处理 7 2 3AWT事件模型 1 事件源事件源是Java事件驱动模式的启动者 是一个事件的产生者 只有事件源产生并发出事件后 才能启动监听器对事件做出响应 例如 在Button组件上点击鼠标会产生以该Button为源的ActionEvent事件 其包含的信息主要有 getActionCommand 返回与动作相关联的命令字符串 getModifiers 返回发生该动作事件期间按下的修改键 getWhen 返回发生该事件的时间戳 paramString 返回标识该动作事件的参数字符串 7 2 3AWT事件模型 要产生事件 那么 作为事件源的类必须满足以下条件 事件源维护已注册的监听器列表 当某监听器注册时 该监听器添加到列表中 而监听器注销时 从列表中删除 事件源必须提供注册方法 以允许监听器注册接收该事件 事件源必须提供注销方法 以允许监听器注销 停止接收事件 事件源必须能够实例化事件类 即产生事件对象 事件对象产生后 事件源必须向所有的注册监听器广播该消息 事件的广播 是通过逐个调用监听器列表中所有监听器的事件处理方法来实现的 7 2 3AWT事件模型 2 事件监听器为了对事件做出响应 必须使用监听器 事件监听器在事件发送线程 java awt EventDispatchThread类的实例 中接受并处理事件 所有的绘图和组件布局也要求在该线程中处理 事件发送线程在AWT和Swing中具有头等重要的地位 在应用中控制组件状态和显示的随时更新方面扮演着关键的角色 要成为监听器必须定义监听器接口 每种事件都有自己的监听器接口 不同事件的监听器接口可能有很大的区别 但所有的监听器接口都必须继承监听器接口基类java util EventListener EventListener本身并没有定义任何方法 只是一个接口 用来表明所有继承自EventListener的接口属于监听器接口类 7 2 3AWT事件模型 监听器接口定义了监听器必须实现的方法 可以在监听器接口中定义任意多的方法 取决于应用所需 监听器的目的是对事件做出响应 因此 在监听器接口方法中 应该定义一个方法来处理事件 即所谓的事件处理方法 事件处理方法以事件对象作为入口参数 包含对事件进行处理的代码 在事件处理方法代码中 监听器可以从入口参数中得到事件对象 并通过该对象获得所需的信息 例如事件源 事件发生时间等等 事件源是肯定可以从事件对象中获得的 因为事件基类EventObject提供了getSource 方法 除此以外 能从事件对象中获得的其他信息 取决于事件类的定义 7 2 3AWT事件模型 3 层次模型层次模型是基于容器的 事件先发送到组件 然后沿容器层次向上传播 没有被组件处理的事件会继续传播到组件的容器 例如 在图19中 Button对象 包含在一个Frame上的Panel中 上的鼠标点击首先向Button发送一个动作事件 如果Button没有处理 该事件会被送往Panel 如果它在那儿仍然没有被处理 则该事件会被送往Frame 这就是层次模型的事件传播过程 图7 19层次模型的事件传播 7 2 3AWT事件模型 4 委托事件模型在委托事件模型中 事件被送往产生该事件的组件 然后 注册一个或多个称为监听器的类 由组件来决定 这些类包含事件处理器 用来接收和处理这个事件 采用这种方法 事件处理器可以安排在与源组件分离的对象中 事件只向注册的监听器报告 每个事件都有一个对应的监听器接口 规定哪些方法必须在该事件的类中定义 以便能处理该事件 如图20所示 图7 20委托事件模型 7 2 3AWT事件模型 从没有注册监听器的组件中发出的事件不会被传播 例如 只含有单个Button的简单Frame 代码如下 importjava awt publicclassTestButtonEvent publicstaticvoidmain Stringargs Framef newFrame Test Buttonb newButton PressMe b addActionListener newButtonHandler 注册事件监听器f add b Center f pack f setVisible true TestButtonEvent 7 2 3AWT事件模型 ButtonHandler类是一个事件处理器类 事件将委托给该类处理 代码如下 importjava awt event publicclassButtonHandlerimplementsActionListener publicvoidactionPerformed ActionEvente System out println Actionoccurred System out println Button slabelis e getActionCommand ButtonHandler 7 2 3AWT事件模型 运行TestButtonEvent类 得到如图21所示的界面 当单击按钮 PressMe 会在命令行输出相应的信息 结果如图22所示 图7 21只有单个Button的委托事件处理 图7 22只有单个Button的事件处理命令行输出 7 2 3AWT事件模型 5 事件类型前面已经介绍了在单一类型事件上下文中从组件接收事件的通用机制 事件类的层次结构如图23所示 大多数事件类在java awt event包中 也有一些事件类在API的其他地方 图7 23AWTEvent的层次结构 7 2 3AWT事件模型 每类事件 都定义了相应的接口 接收该类事件的对象类必须实现该接口 接口定义一个或多个方法 当发生特定的事件时 就会调用这些方法 表1列出了相关的事件类型 并给出了每种类型对应的接口名称 以及所要定义的方法 7 2 3AWT事件模型 7 2 3AWT事件模型 7 2 3AWT事件模型 7 2 3AWT事件模型 6 范例下面看一下鼠标的移动情况 鼠标拖动 当鼠标按下或没有按下时 实现了MouseMotionListener接口的类的对象会监听移动鼠标事件 该接口需要定义两个方法 mouseDragged 和mouseMoved 即使你只对鼠标拖动感兴趣 也必须提供这两个方法 当然 mouseMoved 方法的实现可以是空的 要监听其他鼠标事件 如 鼠标点击 必须实现MouseListener接口 该接口包括若干个方法 mouseEntered mouseExited mousePressed mouseReleased 和mouseClicked 发生鼠标按键事件时 有关鼠标的位置和所按下的键的信息可以从事件中得到 7 2 3AWT事件模型 该示例可以完成对鼠标移动和鼠标拖动事件的监听 当鼠标移动时 相应的鼠标移动事件将其作用 当鼠标拖动时 将在文本框中显示鼠标的位置 拖动鼠标时的结果如图24所示 MouseListen 图7 24鼠标移动和拖动事件处理 7 2 3AWT事件模型 7 多个监听器AWT事件委托模型允许同一个组件带有多个事件监听器 即同一事件可能执行多个不同的操作 只需实现相应的事件处理器方法即可 当然 也有可能同一程序的多个不相关的部分对于同一事件作出反应 例如 将一个上下文敏感的帮助系统加到一个已存在的程序中 监听器机制允许调用addXXXListener方法任意次 而且 可以根据设计需要指定任意多个不同的监听器 事件发生时 所有注册监听器的处理器都会被调用 调用与事件处理器方法的顺序无关 7 2 3AWT事件模型 8 事件适配器Listener可以继承Adapter类 这样 只需要重写需要的方法即可 例如 要实现Listener接口的所有方法的工作量非常大 尤其是MouseListener接口和ComponentListener接口 以MouseListener接口为例 它定义了如下方法 mouseClicked MouseEvent mouseEntered MouseEvent mouseExited MouseEvent mousePressed MouseEvent mouseReleased MouseEvent 这样如果需要监听MouseEvent事件 就必须实现上述5种方法 为了方便起见 Java提供了Adapter类 用来实现含有多个方法的类 其提供的方法是空的 7 2 3AWT事件模型 可以继承Adapter类 只需重写所需要的方法 例如 importjava awt importjava awt event publicclassMouseClickHandlerextendsMouseAdapter 如果只需要mouseClick 方法 可以使用Adapter类来避免写其他不需要的方法publicvoidmouseClicked MouseEvente 鼠标点击处理 7 2 3AWT事件模型 9 匿名类匿名类通常和AWT事件处理一起使用 以简化代码的编写 AnonymousClassTest 这里使用了匿名类 在注册事件监听器方法时使用鼠标移动适配器来处理鼠标移动事件 与前面的示例不同的是这个程序只重写了mouseDragged MouseEvente 方法 mouseMoved MouseEvente 方法没有用就不需要实现 这样可简化编程 7 2 4AWT组件 AWT提供了各种标准控制组件 用来创建图形用户界面 AWT组件提供了文本显示的颜色和字体用于控制界面外观 此外 AWT还支持打印 要想编写图形用户界面的应用程序 就需要了解所有界面组件 这样 才能在创建界面时选择合适的组件 下面就来看看这些AWT组件 7 2 4AWT组件 1 按钮 Button Button组件提供了 按下并动作 的基本用户界面 可以构造一个带文本标签的按钮 用来告诉用户其作用 如 Buttonb newButton Sample b addActionListener this 实现ActionListener监听器接口的类 将在其actionPerformed 方法中处理鼠标点击按钮事件 产生相应的结果 publicvoidactionPerformed ActionEvente System out println Actionoccurred System out println Button slabelis e getActionCommand 7 2 4AWT组件 按钮按下时调用getActionCommand 方法 缺省情况下返回按钮标签字符串 也可使用setActionCommand 方法改变命令名 如 Buttonb newButton Sample b setActionCommand ActionCommandWasHere b addActionListener this 7 2 4AWT组件 下面是针对Button的事件处理的典型示例程序 这里还处理鼠标点击按钮事件 当单击按钮 Sample 会在命令行输出相应的信息 结果如图26所示 ButtonSample 图7 25Button样例 图7 26Button样例命令行输出 7 2 4AWT组件 如果使用setActionCommand ActionCommandWasHere 方法来改变动作命令名 则在命令行输出的信息如图27所示 图7 27Button样例设置命令名后的命令行输出 7 2 4AWT组件 2 复选框 Checkbox Checkbox组件提供简单的 开 关 选择能力 旁边的文本标签说明该组件的功能 如图28所示 如 ckb newCheckbox BackgroudColor 选中或不选 取消 复选框会触发ItemEvent事件 该事件由ItemListener事件监听器处理 它实现itemStateChanged ItemEvente 方法 该方法传递一个ItemEvent事件 ItemEvent事件调用getStateChange 方法来判断复选框是否选中 如果选中其返回值为ItemEvent SELECTED 否则为ItemEvent DESELECTED publicvoiditemStateChanged ItemEvente if e getStateChange ItemEvent SELECTED btn setBackground Color cyan elsebtn setBackground c 7 2 4AWT组件 当 BackgroudColor 复选框选中时 该复选框所表示的功能将发生作用 运行程序 得到如图28所示的结果 CheckboxSample 图7 28Checkbox样例 7 2 4AWT组件 3 复选框组 CheckboxGroup 复选框组提供了将多个复选框作为互斥的集合使用的方法 在任何时刻 集合中只有一个复选框的值是true 值为true的复选框就是当前被选中的复选框 Checkbox可以使用带CheckboxGroup参数的构造方法来创建CheckboxGroup中的每个复选框 CheckboxGroup对象将各个复选框连成一组 这样做 Checkbox的外观会发生改变 同一CheckboxGroup中的复选框会表现出 单选框 的行为 如图29所示 例如 style newCheckboxGroup p newCheckbox Plain true style b newCheckbox Blod false style i newCheckbox Italic false style 7 2 4AWT组件 CheckboxGroup创建单选钮 构造 多选一 机制 上例中 当 Italic 单选钮选中时 该单选钮所表示的功能将发生作用 运行程序 得到如图29所示的结果 图7 29CheckboxGroup样例 7 2 4AWT组件 4 下拉列表 Choice 下拉列表提供了简单的 从列表中选择一个 的功能 例如 Choicec newChoice c add Plain c add Blod c add Italic 7 2 4AWT组件 运行程序 得到如图30所示的界面 点击Choice组件时 会显示一个下拉列表 该列表中包含了所有加入其中的条目 如图7 31所示 ItemListener接口用来观察下拉列表组件的变化 其细节和Checkbox相同 当选择不同的下拉列表值时 该值将响应相应的功能 改变值后 可得到如图32所示的结果 ChoiceSample 图7 30Choice样例 图7 31Choice展开下拉列表样例 图7 32Choice改变选择时的响应 7 2 4AWT组件 5 画布 Canvas 画布提供了一个空白 背景色 的区域 可以用来绘图 显示文本 接收键盘或鼠标的输入等 如图7 33所示 画布可以监听所有适用于普通组件的事件 为了能对某种方式的输入作出反应 可能增加KeyListener MouseMotionListener和MouseListener等监听器对象 在画布中接收键盘事件 必须调用画布的requestFocus 方法 否则一般是不能将击键 导入 画布的 键盘事件会送往另一个组件 或整个丢失了 CanvasSample 图7 33Canvas样例 7 2 4AWT组件 6 标签 Label 标签对象只是简单地显示一行静态文本 该文本可从程序内部改变或控制 而用户只能读却不能改变 Labelprompt newLabel Welcome 标签一般不处理事件 也可以按照和画布相同的方式来处理事件 也就是说 只有调用了requestFocus 方法后 才能可靠地检取键盘击键事件 下面程序可以通过点击Button按钮 Sample 来改变标签的值 LabelSample 图7 34Label样例 7 2 4AWT组件 7 文本组件 TextComponent 文本组件分为单行文本 TextField 和多行文本 TextArea 两部分 它们都是文本组件 TextComponent 的子类 如果查找文本组件类 会找到许多单行文本和多行文本共有的方法 文本组件实现了TextListener 用于处理接收的文本事件 使用文本组件的addTextListener 方法可向该组件注册TextEvent事件监听器 当组件的文本改变时 将调用监听器对象的textValueChanged 方法进行处理 请参考单行文本和多行文本 7 2 4AWT组件 8 单行文本 TextField TextField是TextComponent的子类 是单行文本输入组件 图35所示上面的组件就是TextField 例如 TextFieldtf newTextField 45 tf addActionListener this tf addTextListener this 图7 35TextComponent样例 7 2 4AWT组件 9 多行文本 TextArea TextArea是TextComponent的子类 是多行多列的文本输入组件 图35所示下面的组件就是TextArea 可以用setEditable boolean 将其设置成只读的 而且 TextArea会根据其中的内容决定是否显示水平和垂直的滚动条 要创建一个10行 45字符的TextArea 可用如下代码 TextAreata newTextArea 10 45 同TextField一样 也可以给TextArea注册一般的组件监听器 然而 由于文本是多行的 按下Enter键将导致把另一个字符送入缓冲 如果需要识别 输入完成 可以在文本区旁放置一个 应用 或 确认 按钮 以便用户明确指明 输入完成 7 2 4AWT组件 下面的示例演示了TextField和TextArea组件的用法 例子中 创建了一个TextField对象并监听其ActionListener事件和TextListener事件 还创建了一个TextArea对象 使其内容随TextField的输入而变 也可单独输入多行文本而不影响TextField TextComponentSample 7 2 4AWT组件 10 列表 List 列表将各个文本选项显示在一个区域中 这样就可以同时看到若干个条目 列表可以滚动 并支持单选和多选两种模式 如图38所示 例如 ListmyList newList 4 true myList add 北京 myList add 上海 myList add 南京 myList add 西安 myList add 重庆 myList add 深圳 7 2 4AWT组件 选中或取消选择一个条目时 列表将产生ItemEvent事件 而用户双击列表中的一个条目时 单选模式和多选模式的列表则会产生ActionEvent事件 可根据需要来处理列表产生的事件 下面程序演示了List的用法 图7 38List样例 ListSample 7 2 4AWT组件 11 对话框 Dialog 对话框是拥有标题和边框的弹出窗口 常用于和用户进行某种形式的交互 构建对话框时 必须将其放入Frame窗口或另一个对话框中 当用户最小化拥有对话框的窗口时会自动隐藏该对话框 而当用户恢复该窗口时 对话框会再次出现 对话框可以是无模式的也可以是有模式的 有模式对话框打开时 会阻止从应用程序的其他窗口输入 直到有模式对话框关闭为止 而无模式对话框允许用户改变其状态 同时其他窗口仍然可以拥有焦点并进行处理 因此 无模式对话框常用于工具栏窗口中 缺省情况下 对话框是无模式的 7 2 4AWT组件 由于对话框是Window的子类 所以它的缺省布局管理器是BorderLayout Dialogd newDialog f Dialog false d add newLabel Hello I maDialog Border Layout CENTER d pack 对话框在创建时通常是不可见的 大多在用户要求该对话框作出反应时 才显示该对话框 如 publicvoidactionPerformed ActionEventev d setVisible true 要隐藏对话框 必须调用setVisible false 方法 典型的做法是添加一个WindowListener监听器 通过调用监听器的windowClosing 方法来关闭对话框 7 2 4AWT组件 下面代码实现了一个有模式对话框 可以接受用户登录信息 DialogSample 图7 40Dialog的上一级窗口 7 2 4AWT组件 当点击 会员登录 按钮 将弹出会员登录对话框 输入信息后点击确定或放弃即可返回上一级窗口 此时欢迎窗口不能接受用户输入 结果如图7 41所示 图7 41Dialog样例 7 2 4AWT组件 在会员登录对话框输入如图41所示的信息 点击确定后 用户输入的信息将进行用户的身份验证 这里没有实现 通过身份验证后 会员名将显示在欢迎窗口中 结果如图7 42所示 图7 42Dialog结果传入上一级窗口 7 2 4AWT组件 12 文件对话框 FileDialog 通过文件对话框 用户可选择想要操作的文件作为用户输入 实现和文件的交互 FileDialog有自己的窗口以及窗口元素 允许用户浏览文件系统 以及为以后的操作选择特定的文件 当用户想打开或存储文件时 可使用文件对话框进行操作 主要代码如下 FileDialogd newFileDialog parentFrame FileDialog d setVisible true Stringfname d getFile 通常不需要处理FileDialog的事件 调用setVisible true 将阻塞对其他组件的访问 直至用户选择确认的文件为止 7 2 4AWT组件 FileDialog的样例如图7 43所示 图7 43FileDialog样例 FileDialogSample 图7 44FileDialog的上一级窗口 7 2 4AWT组件 13 滚动面板 ScrollPane 滚动面板为单一组件提供水平方向或 和竖直方向的滚动条 总是和容器相关联 如 Frame Panel等 滚动条的显示方式可以有三种 需要时显示 SCROLLBARS AS NEEDED 只有当滚动面板需要的时候才创建并显示滚动条 总是显示 SCROLLBARS ALWAYS 滚动面板总是创建并显示滚动条 和不显示 SCROLLBARS NEVER 滚动面板不创建和显示滚动条 可在ScrollPane类的构造方法中指定相应的显示方式 如 publicScrollPane publicScrollPane intpolicy policy取上面的三种值之一 7 2 4AWT组件 程序比较简单 只是创建了3个不同显示方式的ScrollPane对象 然后在这3种不同显示方式的ScrollPane对象中各添加了一个TextArea对象 以便观察ScrollPane的行为 运行程序 得到如图7 45所示的结果 ScrollPaneDemo 图7 45ScrollPane样例 7 2 4AWT组件 通常 滚动面板不处理事件 而是由滚动面板包含的组件来处理 它的作用是提供更大的视图或工作空间 滚动面板创建和管理滚动条 并持有一个组件 不能控制其布局管理器 可以将一个面板加入到滚动面板中 配置面板的布局管理器 并在该面板中放置其他的组件 ScrollPaneSample 图7 46在ScrollPane上添加Panel以放置更多的组件 7 2 4AWT组件 14 菜单 Menu 菜单与其他组件不同 不能将菜单添加到一般的容器中 而且不能使用布局管理器对其进行布局 只能将菜单添加到菜单容器中 使用setMenuBar 方法将菜单条和窗口关联起来 然后 将菜单添加到菜单条 MenuBar 中 就可以在菜单中添加菜单或菜单项了 弹出式菜单是一种特殊的菜单 以浮动窗口形式出现 不需要布局 7 2 4AWT组件 1 帮助菜单菜单条的特性之一是可以用setHelpMenu Menu

温馨提示

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

评论

0/150

提交评论