第16讲图形用户界面二ppt课件.ppt_第1页
第16讲图形用户界面二ppt课件.ppt_第2页
第16讲图形用户界面二ppt课件.ppt_第3页
第16讲图形用户界面二ppt课件.ppt_第4页
第16讲图形用户界面二ppt课件.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

第16讲图形用户界面 事件驱动设计AWT高级组件 一 教学目标 掌握布局管理器的使用理解事件驱动机制掌握事件驱动设计方法掌握AWT高级组件的应用 布局管理器 在前面课程的学习中 经常会发生这样的情况 当将很多的组件放在容器里面的时候 这些组件摆放将很凌乱 有时候甚至看不见部分组件 这是因为没有对这些组件进行布局管理 AWT提供了5个类来对容器页面进行管理 它们均直接继承自java lang Object类 FlowLayout 流式布局 BorderLayout 边界布局 GridLayout 网格布局 CardLayout 多层 卡片布局 GridBagLayout 动态网格布局 布局管理器 FlowLayout FlowLayout是Applet和Panel容器的默认布局管理器 它按照从上到下 从左到右的规则 将添加到容器中的组件依次排列 默认情况下每行组件均居中排列 自动调用组件的getPreferredSize 方法 使用组件的最佳尺寸来显示组件 FlowLayout的构造函数 FlowLayout 居中对齐方式 组件间的水平和竖直间距为缺省值5个象素 FlowLayout intalignment 可以设定每一行组件的对齐方式FlowLayout intalignment inthorz intvert 可以设定组件间的水平和垂直距离 importjava awt publicclassEx9 9 publicstaticvoidmain Stringargs Framefrm newFrame FlowLayout演示窗口 Buttonbut1 but2 but3 but4 but5 but1 newButton 按钮一 but2 newButton 按钮二 but3 newButton 按钮三 but4 newButton 按钮四 but5 newButton 按钮五 设置FlowLayout布局 并且组件左对齐frm setLayout newFlowLayout FlowLayout LEFT frm add but1 把五个按钮加入容器中frm add but2 frm add but3 frm add but4 frm add but5 frm setSize 200 100 frm setLocation 100 100 frm setVisible true 程序分析 程序运行结果如图所示 当拖动窗口的边界改变窗口大小时 将会发现窗口里面的组件也随着窗口大小而改变位置 组建的布局就像流动式的一样 这就是FlowLayout布局的特点 FlowLayout示例 布局管理器 BorderLayout BorderLayout是Windows及其子类Frame的默认布局管理器 它将容器分为5个部分 分别命名为NORTH SOUTH WEST EAST和CENTER 下面是BorderLayout所定义的构造函数 BorderLayout 生成默认的边界布局BorderLayout inthorz intvert 设定组件间的水平和垂直距离用add 方法往容器中添加组件时必须指明添加的位置 若没有指明放置位置 则表明为默认的 Center 方位 若每个区域或若干个区域没有放置组件 东西南北区域将不会有预留 而中间区域将置空 add North newButton North add newButton West BorderLayout SOUTH importjava awt publicclassEx9 10 publicstaticvoidmain Stringargs Framefrm newFrame BorderLayout演示窗口 BorderLayoutborder newBorderLayout 2 5 Buttonbut1 but2 but3 but4 but5 but1 newButton 按钮东 but2 newButton 按钮南 but3 newButton 按钮西 but4 newButton 按钮北 but5 newButton 按钮中 frm setLayout border frm add but1 border EAST frm add but2 border SOUTH frm add but3 border WEST frm add but4 border NORTH frm add but5 border CENTER frm setSize 200 150 frm setLocation 100 100 frm setVisible true 程序分析 运行程序 将看到如图的图形 如果容器使用BorderLayout类对象作为布局管理器 添加任何一个组件都将以边界作为参照 比如 frm add but1 border EAST 就是在容器frm的最左端添加一个组件but1 BorderLayout示例 说明 每个区域只能添加一个组件 若添加多个 则只能显示一个组件 如果想在一个区域添加多个组件 则必须先在该区域放一个Panel容器 再将多个组件放在该Panel容器中 布局管理器 GridLayout GridLayout是一种很容易理解的布局管理器 它将容器按照指定的行数 列数分成大小均匀的网格 然后将添加到容器里面的组件一一放入 GridLayout的构造函数如下所示 GridLayout 生成一个单列的网格布局GridLayout introw intcol 生成一个设定行数和列数的网格布局GridLayout introw intcol inthorz intvert 可以设置组件之间的水平和垂直间隔 importjava awt publicclassEx9 11 publicstaticvoidmain Stringargs Framefrm newFrame GridLayout演示窗口 GridLayoutgrid newGridLayout 3 4 frm setLayout grid for inti 1 i 12 i frm add newButton Integer toString i frm setSize 200 150 frm setVisible true 程序分析 由于使用GridLayout布局管理器布局的容器里面添加的组件大小完全相同 所以经常将界面中具有这些规则的组件放入一个新的容器里面 使用GridLayout进行布局 然后再将这个容器添加到界面容器里面 GridLayout示例 布局管理器 CardLayout CardLayout是一种将每个组件看作一张卡片 且将所有卡片码成一摞 每一时刻只有一张卡片被显示的布局管理器 有人将其形象地描述为一副落成一叠的扑克牌 第一个添加到容器中的组件位于最低层 最后一个添加到容器中的组件位于最上层 请参考API文档熟悉CardLayout类的构造方法和常用方法 布局管理器 GridBagLayout GridBagLayout生成的布局管理器也是和GridLayout一样是使用网格来进行布局管理的 所不同之处在于GridBagLayout可以通过类GridBagConstraints来控制布局容器内各组件的大小 每个组件都使用一个GridBageConstraints对象来给出它的大小和摆放位置 这样就可以按照设计者的意图 改变组件的大小 把它们摆在设计者希望摆放的位置上 这种灵活性是前面几个布局管理器所不具备的 有关GridBageLayout布局管理器使用的详细情况参阅API文档 容器的嵌套 实际应用中 可能将整个窗口分成很多小块 每一块包含几个组件 这些组件用一个容器来存放 然后再将这些小块容器添加到窗口对象中 AWT就提供了另外一个容器类Panel 可以在一个容器中添加几个Panel容器对象 每个Panel容器对象都可以指定不同的布局方式 importjava awt publicclassEx9 12 publicstaticvoidmain Stringargs Framefrm newFrame 容器的嵌套 Labellab newLabel 0 Label RIGHT frm setLayout null Panelpnl newPanel GridLayoutgrid newGridLayout 4 4 pnl setLayout grid Strings 7 8 9 4 5 6 1 2 3 0 for inti 0 i 16 i pnl add newButton s i lab setBackground Color orange lab setBounds 20 30 160 20 pnl setBounds 20 60 160 80 frm add lab frm add pnl frm setSize 200 150 frm setVisible true 程序分析 程序中 将大小相同的12个按钮组件添加在一个Panel对象里面 使用GridLayout进行布局 然后再将这个Panel对象添加到顶层容器Frame对象中 Panel示例 事件驱动设计 事件驱动设计 在窗口程序设计里 事件 event 的设计是不可或缺的一块 当按下按钮时 也就触发了 按钮被按 的事件 至于计算机要做什么样的反应 则是由程序代码来做判断与决定的 前面已经学会来怎样去绘制一个图形用户界面 但是还没有编写用户交互的代码 下面来认识一下Java的事件处理机制 每发生一个事件 程序都需要作出相应的响应 这称为事件处理 委派事件模型 事件处理机制的思想是 可能产生事件的对象 事件源 如窗口 按钮等 收到用户发出的操作指令后产生相应的事件 然后将这些事件分别发送给不同的监听器 由监听器来处理这些事件 并将处理结果返回 整个过程中 监听器简单的等待 直到它收到一个事件 这种事件处理机制使得处理事件的应用程序逻辑与生成那些事件的界面逻辑 容器或者组件 彼此分离 相互独立存在 importjava awt importjava awt event classEx9 13extendsFrameimplementsActionListener staticEx9 13frm newEx9 13 staticButtonbtn newButton 将窗口变成黄色 publicstaticvoidmain Stringargs btn addActionListener frm 把frm向btn注册 让frm监听事件frm setLayout newFlowLayout frm setTitle ActionEvent frm setSize 200 150 frm add btn frm setVisible true publicvoidactionPerformed ActionEvente frm setBackground Color yellow 程序分析 事件源 也就是事件发生的场所 通常就是各个组件 如本例的按钮对象 事件 用户对界面操作在Java语言上的描述 它由用户和界面中的组件交换而产生 比如移动鼠标 点击鼠标按钮和按下键盘键等都可以引发事件 本例中 当按下按钮时 就产生了一个事件ActionEvent 监听 Java使用一组接口来实现对事件源的监听 本例中 为了使frm窗口对象能够监听按钮触发的事件 让Ex9 13对象实现事件处理的接口 自身实现监听器示例 importjava awt importjava awt event classEx9 14 staticFramefrm newFrame ActionEvent staticButtonbtn newButton 将窗口变成黄色 publicstaticvoidmain Stringargs btn addActionListener newActLis frm setLayout newFlowLayout frm setTitle ActionEvent frm setSize 200 150 frm add btn frm setVisible true 定义内部类ActLis 并实现ActionListener接口staticclassActLisimplementsActionListener publicvoidactionPerformed ActionEvente 事件发生的处理操作frm setBackground Color yellow 程序分析 上个例子中 选择了窗口作为监听者 事实上也可以自定义一个类来实现ActionListener接口 再把此类产生的对象作为监听 通常把实现接口的类定义在主类里 自己成为它的内部类 内部类实现监听器示例 事件处理类 Java把事件类大致分成两种 语义事件 semanticevents 与底层事件 low leverevents 指屏幕上可视化组件的低级输入或窗口系统事件 其中语义事件直接继承自AWTEvent 如ActionEvent AdjustmentEvent与ComponentEvent等等 底层事件则是继承自ComponentEvent类 如ContainerEvent FocusEvent WindowEvent与KeyEvent等等 下表提供了常用的事件类 事件监听接口与事件监听接口提供的方法 ActionEvent事件类的处理 ActionEvent事件对应于组件的主要用途 点击按钮 选择菜单项目 或向单行文本框输入字符串并敲击Enter键时 都会发生ActionEvent事件 例 Ex9 15 程序分析 点击前面两个按钮 文本框将显示相应的信息 点击退出按钮 程序将结束 类Ex9 15继承自Frame frm对象是按钮组件的容器 当按下按钮时 将会发生ActionEvent类事件 按钮本身不作任何处理 这时候就会把事件向上传递 直到窗口对象frm监听为止 当frm对象监听到按钮事件后 就会运行ActionListener接口提供的方法actionPerformed ActionEvente 由于ActionEvent类继承自EventObject类 所以可以使用EventObject类提供的方法getSource 来查看是哪个对象激活的事件 TextEvent类 文本事件是指当窗口中TextField或TextArea组件里的文本改变时所触发的事件 Java用TextEvent类来处理这个事件 而TextListener则为监听TextEvent事件的接口 该接口声明了textValueChanged 方法 publicvoidtextValueChanged TextEvente 当TextEvent事件发生时 textValueChanged 就会执行 Ex9 16 程序分析 当在文本框输入文字时 textValueChanged 方法将会执行 两个标签分别显示文本框的内容和文本的长度 程序中在类Ex9 16里面定义了一个内部类TextHandler 由TextListener接口实现 文本框组件tf向内部类对象注册监听 KeyEvent类 KeyEvent类继承自InputEvent类 是属于低层次的事件类 只要在键盘上按下任何键 都会触发按键事件 要处理KeyEvent事件 可以用KeyListener接口来承担监听 Ex9 17但是KeyListener接口提供的事件处理方法较多 在实现的类里针对每一个方法都要编写处理代码 即使没有作相关的处理 也必须要把这些方法都写上去 所以用起来有点不方便 除了KeyListener之外 AWT还提供了KeyAdapter类来处理KeyEvent事件 Ex9 18 程序分析 程序中类Ex9 17用KeyListener接口处理KeyEvent事件 必须用类实现KeyListener接口 然后用这个类对象来监听KeyEvent事件 当在文本框按键时 KeyEvent事件将被触发 frm对象监听到之后 KeyListener接口定义的三个方法将会执行 程序中类Ex9 18里面定义了一个内部类KeyLis 然后用这个内部类的对象去监听KeyEvent事件 在内部类KeyLis中 定义了方法keyTyped 方法 这个方法覆盖了父类KeyAdapter类中的方法keyTyped MouseEvent类 鼠标事件类MouseEvent也继承自InputEvent类 属于低层次事件类的一种 只要鼠标的按钮按下 鼠标指针进入或移出事件源 移动鼠标 拖拽鼠标 都会触发鼠标事件 同KeyEvent事件一样 可以使用多种方法来处理MouseEvent事件 AWT提供了MouseListener接口和MouseMotionListener接口作为MouseEvent事件的监听 为了方便操作 还提供了MouseAdapter类和MouseMotionAdapter类来处理MouseEvent事件 它们分别用MouseListener接口和MouseMotionListener接口进行定义 MouseEvent类 1 用MouseListener接口来处理MouseEvent事件例 Ex9 192 用MouseMotionListener接口来处理MouseEvent事件例 Ex9 203 用MouseAdapter类事件处理MouseEvent事件例 Ex9 21 WindowEvent类 低层次事件类 窗口的创建 缩小 关闭 变成非活动窗口等操作都会触发WindowEvent事件 AWT提供了WindowListerner接口用于窗口事件的监听 为了简便操作 提供了WindowAdapter类来处理WindowEvent事件 WindowLister

温馨提示

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

评论

0/150

提交评论