程序设计主要内容_第1页
程序设计主要内容_第2页
程序设计主要内容_第3页
程序设计主要内容_第4页
程序设计主要内容_第5页
已阅读5页,还剩173页未读 继续免费阅读

下载本文档

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

文档简介

主要内容 基于Java程序的GUI设计工具 主要包括下述几个概念 组件 Component API 容器 Container事件处理 主要内容 容器及布局管理 解决组件在容器中的位置和大小 常用组件介绍 按钮 文本框 标签 列表框 菜单等 事件管理 如何监听和响应事件 主要内容 在Java中 开发一个GUI程序 通常需要以下几步 1 构建一个顶层容器 通常是JFrame或JApplet 2 构建若干个组件 组件可以是其它容器 3 设定容器的布局管理器 用容器的add 方法将这些组件加入到这个容器中 4 设置组件事件 并将组件事件与代码关联 重点掌握的内容 从介绍容器及布局管理入手 主要掌握组件如何布置问题 重点掌握取消布局管理的方法 事件管理 是本章的核心 对事件管理的四个要素 各起什么作用 怎样应用熟练掌握 对事件处理的三个方式要清楚 至少掌握一种方法 对各组件的具体使用 重点是按钮 文本框 标签 其它了解 对菜单 鼠标 键盘的事件管理做了解 7 1图形用户界面概述 图形用户界面GUI GraphicsUserInterface 1 目的在Applet或Application程序中提供人机交互界面 是不可缺少的部分 2 有关的java包及类 java awt包 抽象窗口工具包AWT 是JDK1 0版本 主要包括如下 绘制图形 控制字体和颜色 容器及布局管理 各种常用组件 如按钮 文本框 列表框等 菜单 对话框 事件管理 javax swing包 是对AWT的升级和扩充 比AWT组件更丰富 功能更强 由JDK1 2以上版本提供 兼容AWT 各组件名前加J字头 如JButton 为了开发GUI程序 在Java1 2版之前 Java提供了一个AWT类库 称为抽象窗口工具箱 简称AWT 由于AWT存在严重缺陷 Sun从Java1 2版开始提供了一个新的组件库Swing Swing可以说是第二代GUI开发工具集 它是通过javax swing包提供的 javax swing包也是Java基础类库的组成部分 7 1图形用户界面概述 由于Swing组件比AWT组件有许多优点 所以新开发的程序应该使用Swing组件而不应该再使用AWT组件 Swing组件并没有完全取代AWT 它只是替代了AWT包中的图形用户界面组件 如Button TextField TextArea等 AWT中的一些辅助类 如Graphics Color Font LayoutManager等 仍然保持不变 另外 Swing仍然使用AWT的事件模型 7 1图形用户界面概述 Swing组件简介 1 组件及层次在Java语言中 与图形用户界面相关的包有多个 其中比较重要的有java awt包 java awt event包 javax swing包 图7 1给出了有关包中常用的类及类的层次结构 1 组件及层次 图7 1中Applet类在java applet包中 以J开头的类在javax swing包中 其他类在java awt包中 图7 1JavaGUI所用类的层次结构图 表7 1构建图形用户界面常用的类 Java把Component类的子类或间接子类创建的对象称为一个组件 把Container的子类或间接子类创建的对象称为一个容器 AWT中的大部分类都是容器类 Container 和组件类 Component 的子类或间接子类 1 组件及层次 Java awt包中一部分类的层次关系如图所示 1 组件及层次 2 组件分类 容器组件 容器组件又可以分为三类 顶层容器 包括JFrame JApplet JDialog 通用容器 包括JPanel JScrollPane JSplitPane JTabbedPane JToolBar 专用容器 包括JInternalFrame JLayeredPane JRootPane等 基本组件 基本组件包括JButton JTextField JComboBox JList JMenu JSlider等 这些组件有的主要用于信息的显示 如JLabel JProgressBar JToolTip等 有的可以在其中编辑信息 如JTextArea JtextField J JColorChooser JTable JTree等 菜单组件 菜单组件包括JMenuBar JMenu JMenuItem JRadioButtonMenuItem JCheckBoxMenuItem和JPopupMenu等 这些组件主要用于构建各种菜单 2 组件分类 JApplet java lang Applet的扩展版本 JButton 按钮或命令按钮 JCheckBox 复选框 JCheckBoxMenuItem 复选菜单项 JComboBox 组合框 JComponent Swing组件的基类 JDialog 对话框窗口的基类 JLabel 标签项 JList 列表框 JMenu 菜单 JMenuBar 菜单条 JMenuItem 菜单项 JPanel 通用的轻量容器 JPasswordField 文本框 用来输入口令 JComponent类常用方法 JComponent抽象类是所有Swing组件的超类 其中定义了每个组件都可以使用的方法 常用的方法有 publicvoidsetSize intwidth intheight 设置组件或容器的大小 publicvoidsetVisible booleanb 设置组件或容器是否可见 publicvoidsetBackground Colorc 设置组件的背景颜色 Color为颜色类 publicColorgetBackground 返回组件的背景颜色 Color为颜色类 JComponent类及其方法 publicvoidsetForeground Colorc 设置组件的前景颜色 publicColorgetForeground 返回组件的前景颜色 publicvoidsetFont Fontf 设置组件上使用的字体 Font为字体类 publicFontgetFont 返回组件上使用的字体 publicGraphicsgetGraphics 返回组件的图形上下文 graphicscontext 或绘图对象 Graphics为图形上下文类 使用该类对象可以在组件上绘制图形 publicvoidsetToolTipText Stringtext 设置组件上的提示信息 publicStringgetToolTipText 返回组件上的提示信息 Container类及其方法 容器 Container 也是一个类 实际上是Component的子类 因此容器本身也是一个组件 具有组件的所有性质 但是它的主要功能是容纳其他组件和容器 添加到容器中的组件位置和大小由容器的布局管理器决定 LayoutManager setLayout 方法设置容器布局 容器中可以容纳其他组件 通过调用容器的add 方法把其他组件添加到容器中 Container类及其方法 Container类中的常用方法 publicComponentadd Componentcomp publicComponentadd Componentcomp intindex 向容器中添加组件 index参数指定组件添加到容器中的位置 无index参数则添加到默认位置 publicvoidremove Componentcomp 从容器中清除指定的组件 Container类及其方法 publicvoidsetLayout LayoutManagermgr 设置容器的布局 参数mgr是布局管理器对象 它决定组件在容器中如何摆放 publicvoidpaint Graphicsg 在容器上绘制图形 publicvoidpaintComponents Graphicsg 在容器上绘制图形 publicvoidupdate Graphicsg 更新容器上绘制的图形 7 2容器 Container 容器的作用 容纳其它组件 容器类 Container类 继承于Component类 基本容器 共有三种 1 JApplet Java小程序容器 可作为顶层容器 除菜单以外 可加入任何其它组件 2 JFrame 框架容器 生成弹出式窗口 可加入菜单和任何组件 是独立于JApplet的顶层容器 可在Applet和Application中使用 3 JDialog 对话框容器 也是一种弹出式窗口 作为顶层容器 可加入其它组件 但不能加入菜单 用于弹出一些信息 java提供一些标准的对话框 如可推出Window风格的文件对话框 对文件进行打开 保存等 一般容器 有JPanel JScrollPanel JTabbedPanel JToolBar等 简单的框架窗口 1 创建简单的框架窗口每个使用SwingGUI的程序必须至少有一个顶层Swing容器 对于GUI应用程序来说 一般应该有一个主窗口 也称为框架窗口 在Swing中 框架窗口是由JFrame对象实现的 2 JFrame类常用的构造方法有 publicJFrame 创建一个没有标题的窗口对象 publicJFrame Stringtitle 创建一个以title为标题的窗口对象 3 常用方法 1 创建窗口直接创建一个JFrame的实例或通过继承JFrame类来定义子类 再创建对象 例 JFrameframe newJFrame 窗体 2 设置标题通过super Stringtitle 调用基类的构造方法 或通过setTitle Stringtitle 方法设置标题 JFrameframe newJFrame 窗体 或JFrameframe newJFrame frame setTitle 窗体 3 设置初始位置voidsetLocation intx inty 设置初始位置 其中x y是窗口左上角在屏幕上的坐标值 4 设置大小voidsetSize intw inth 设置Frame尺寸 简单的框架窗口 5 设置窗体是否可见voidsetVisible booleanb 设置窗体是否可见 6 窗体自适应组件voidpack 调整Frame大小自动适应显示所有组件 7 定义关闭行为setDefaultCloseOperation intoperation 方法设置关闭行为 其中operation取值如下 EXIT ON CLOSE 当关闭窗口时退出程序 DO NOTHING ON CLOSE 当关闭窗口时不做任何处理 HIDE ON CLOSE 当关闭窗口时隐藏这个窗口 默认 DISPOSE ON CLOSE 当关闭窗口时隐藏并处理这个窗口 简单的框架窗口 程序7 1HelloSwing java importjavax swing publicclassHelloSwing publicstaticvoidmain Stringargs JFrameframe newJFrame HelloSwing frame setSize 400 240 frame setVisible true frame setDefaultCloseOperation JFrame EXIT ON CLOSE 程序7 1HelloSwing java 图7 3最简单的框架窗口 继承JFrame类 程序7 1的方法在创建比较简单的窗口时还可以 如果窗口比较复杂 就会使得main 方法的内容过多 一般应该创建一个继承JFrame类的子类 然后编写程序创建该类对象 程序7 2HelloSwing java importjavax swing publicclassHelloSwingextendsJFrame publicHelloSwing1 this HelloSwing publicHelloSwing Stringtitle super title setSize 400 250 setLocation 350 250 setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE publicstaticvoidmain Stringargs HelloSwingframe newHelloSwing 在框架中添加组件 若向顶层容器 JFrame JApplet JDialog 中添加组件 可以使用容器的add 方法实现 必须清楚容器使用的布局管理器 否则可能会得不到需要的结果 程序7 3SimpleFrame java importjava awt importjavax swing publicclassSimpleFrameextendsJFrame JButtonjButton1 jButton2 publicSimpleFrame Stringtitle super title jButton1 newJButton OK jButton2 newJButton Cancel setLayout newFlowLayout add jButton1 add jButton2 setSize 400 300 setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE publicstaticvoidmain String args SimpleFrameframe newSimpleFrame FrameWithButton 在框架中添加组件 实际上JFrame对象是由多个窗格组成的 如图7 6所示 在框架中添加组件 JFrame对象的中间层是内容窗格 ContentPane 它是一个容器对象 用容器的add 方法添加的组件实际是添加到该内容窗格中的 每个容器都有一个布局管理器 它管理着组件在其中的大小 位置等 内容窗格默认的布局管理器是BorderLayout 即边界式布局 可以使用容器的setLayout 方法改变容器的布局管理器 7 3容器布局 1BorderLayout布局管理器2FlowLayout布局管理器3GridLayout布局管理器4其他布局管理器5面板容器及容器的嵌套6应用程序外观 Java语言的一个特点是强调程序的平台无关性 对于图形用户界面同样是这样 在Java的图形界面程序中 它是通过为每种容器提供了布局管理器来实现组件布局的 所谓布局管理器就是为容器设置一个LayoutManager对象 即布局管理器对象 来管理组件在容器中摆放的顺序 位置 大小以及当窗口大小改变后组件如何变化等特征 7 3容器布局 通过使用布局管理器机制就可以实现GUI的跨平台性 同时避免为每个组件设置绝对位置 常用的布局管理器有 FlowLayoutBorderLayoutGridLayoutCardLayout和GridBagLayout这些类都是在java awt包中定义的 7 3容器布局 每种容器都有默认的布局管理器 也可以为容器指定新的布局管理器 如果要将某个容器的布局管理器设置为新的布局 需要使用构造方法创建一个布局管理器对象 然后使用容器的setLayout 方法将容器设置为这种布局管理器 7 3容器布局 BorderLayout 边界式布局 是Swing包中容器JFrame JApplet JDialog的默认布局管理器 布局特点 将容器分为东西南北中五个区域 通常每个区域放一个组件 位置及大小无法控制 构造方法 有两个publicBorderLayout publicBorderLayout inth Gap intv Gap 1 BorderLayout布局管理器 BorderLayout的构造方法 publicBorderLayout inthgap intvgap 该构造方法创建一个布局管理器对象 hgap和vgap分别指定使用这种布局时组件之间的水平间隔和垂直间隔距离 单位为像素 publicBorderLayout 该构造方法创建一个BorderLayout布局管理器对象 使用这种布局时组件之间没有间隔 BorderLayout布局管理器 BorderLayout布局也叫边界式布局 它将容器分成东 南 西 北 中五个区域 每个区域可放置一个组件或其他容器 北占据容器的上方 东占据容器的右侧 等等 中间区域是在东 南 西 北都填满后剩下的区域 若要改变容器的布局管理器须调用容器的setLayout 方法 它的格式为 publicvoidsetLayout LayoutManagerlayout BorderLayout布局管理器 使用BorderLayout布局管理器 当窗口的大小改变时 容器中的组件大小相应改变 当窗口垂直延伸时 东 西 中区域也延伸 而当窗口水平延伸时 南 北 中区域也延伸 当某个区域没有添加组件时 中央组件会占据无组件的空间 但若没有中央组件 四周组件都有 中央区域空出 请读者自己修改程序 去掉某个区域的组件 观察程序运行效果 BorderLayout布局管理器 向BorderLayout布局的容器中添加组件应该使用add Componentc intindex 方法 c为添加的组件 index为指定的位置 指定位置需要使用BorderLayout类定义的五个常量 BorderLayout NORTHBorderLayout SOUTHBorderLayout EASTBorderLayout WESTBorderLayout CENTER如果不指定位置 组件添加到中央位置 见BordLayoutTest java 程序7 4BorderLayoutDemo java importjava awt importjavax swing publicclassBorderLayoutDemoextendsJFrame JButtonjButton1 jButton2 jButton3 jButton4 jButton5 publicBorderLayoutDemo Stringtitle jButton1 newJButton 北 jButton2 newJButton 南 jButton3 newJButton 西 jButton4 newJButton 东 jButton5 newJButton 中 设置布局管理器setLayout newBorderLayout 10 10 add jButton1 BorderLayout NORTH add jButton2 BorderLayout SOUTH add jButton3 BorderLayout WEST add jButton4 BorderLayout EAST add jButton5 BorderLayout CENTER setSize 300 240 setTitle title setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE publicstaticvoidmain String args BorderLayoutDemowindow newBorderLayoutDemo BorderDemo 程序运行结果如图所示 图7 6边界式布局 FlowLayout 流式布局 是Applet和Frame和JPanel的默认布局 布局特点 组件按加入的先后顺序依次从左至右 从上至下排列 位置及大小无法控制 构造方法 有三个publicFlowLayout publicFlowLayout intalignment 对齐方式 FlowLayout LEFT左对齐FlowLayout CENTER中间对齐FlowLayout LEFT右对齐publicFlowLayout intalignment inth Gap intv Gap h Gap水平间隙 v Gap垂直间隙 2 FlowLayout布局管理器 FlowLayout布局管理器 FlowLayout布局也叫流式布局 它是最简单的布局管理器 是Applet Frame和JPanel的默认布局 设置为这种布局管理器的容器 当向其中添加组件时组件是从左到右 从上到下 一个一个地放置到容器中 一行放不下 放到下一行 采用这种布局管理器的容器 当调整窗口大小后 布局管理器会重新调整组件的摆放位置 组件的大小和相对位置不变 组件的大小采用最佳尺寸 FlowLayout类常用的构造方法 publicFlowLayout intalign inthgap intvgap 指定添加到容器中组件的对齐方式 align 水平间距 hgap 和垂直间距 vgap 对齐方式align的取值必须为FlowLayout定义的整型常量之一 FlowLayout LEFT 表示左对齐FlowLayout RIGHT 右对齐FlowLayout CENTER 居中对齐水平间距是指水平方向上两个组件之间的距离 单位是像素 垂直间距是行之间的距离 单位也是像素 FlowLayout类常用的构造方法 publicFlowLayout intalign 该构造方法只指定对齐方式 组件之间的水平间距和垂直间距使用默认值5个像素 publicFlowLayout 使用该构造方法构造的对象 对齐和间距都采用默认值 居中对齐 水平间距和垂直间距是5个像素 程序7 5FlowLayoutDemo java importjava awt importjavax swing publicclassFlowLayoutDemoextendsJFrame publicFlowLayoutDemo FlowLayoutlayout newFlowLayout FlowLayout CENTER 10 20 setLayout layout add newJButton Button1 add newJButton 2 add newJButton Button3 add newJButton Long NamedButton4 add newJButton Button5 setTitle FlowLayoutDemo 设置窗口标题setSize 380 150 setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE publicstaticvoidmain Stringargs FlowLayoutDemowindow newFlowLayoutDemo 程序的运行结果如图所示 图7 7流式布局的应用 3 GridLayout布局管理器 也叫网格式布局 将容器分成大小相等的单元格 每个单元格可放置一个组件 每个组件占据单元格的整个空间 调整容器的大小 单元格大小随之改变 GridLayout类的构造方法 publicGridLayout introws intcols inthgap intvgap 参数rows和cols分别指定网格布局的行数和列数hgap和vgap指定组件的水平间隔和垂直间隔 单位为像素 行和列参数至少有一个为非0值 publicGridLayout introws intcols 缺省组件之间的间隔 组件之间间隔为0像素 publicGridLayout 创建只有一行的网格布局对象 每个组件占一列 所有组件在一行 组件之间间隔为0像素 GridLayout类的构造方法 如果指定的行数和列数与添加的组件个数不一致时当行数 列数都不为零 以行优先若有一个为零 则以非零值优先例 cp setLayout newGridLayout 3 1 10 20 如果添加的组件多于3个 结果是3行多列 cp setLayout newGridLayout 3 0 10 20 如果添加的组件多于3个 结果是3行多列 cp setLayout newGridLayout 0 3 10 20 如果添加的组件多于3个 结果是多行3列 GridLayout布局管理器 向网格布局的容器中添加组件 只需调用容器的add 方法即可 不用指定位置 系统按照先行后列的次序依次将组件添加到容器中 程序7 6GridLayoutDemo javaimportjava awt importjavax swing publicclassGridLayoutDemoextendsJFrame publicGridLayoutDemo setLayout newGridLayout 0 2 add newJButton Button1 add newJButton 2 程序7 6GridLayoutDemo java add newJButton Button3 add newJButton Long NamedButton4 add newJButton Button5 setTitle GridLayoutDemo pack 以紧缩的形式显示组件setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE publicstaticvoidmain Stringargs GridLayoutDemowindow newGridLayoutDemo GridLayout布局管理器 程序的运行结果如图所示 图9 8网格布局的应用 4 其他布局管理器 除上面介绍的布局管理器外 Java语言还提供了若干布局管理器 例如 CardLayout GridBagLayout BoxLayout GroupLayout和SpringLayout等 每种布局管理器都有自己的特点 应用在特殊的场合 其中有些非常复杂 可应用于较复杂的图形用户界面的设计中 如果界面复杂 可以考虑使用集成开发环境 IDE 来设计用户界面 其他布局管理器 在设计图形界面时 Java也支持组件绝对定位的设计 如果需要手工控制组件在容器中的大小和位置 应该将容器的布局管理器设置为null 即调用容器的setLayout 方法 并将参数指定为null 然后调用组件的setLocation 方法设置组件在容器中的位置 调用setSize 或setBounds 方法设置组件的大小 不推荐使用这种方法 5 取消布局管理器及布置组件的方法 取消布局管理器的目的 不受布局管理器固定格式的限制 使组件可任意大小 摆放在任何位置 增加使用的灵活性 取消的方法 容器的对象名 setLayout null 布置组件的方法 设置组件对象摆放位置及大小的方法 组件对象名 setBounds newRectangle x y w h 或setBounds x y w h 再把组件对象添加到容器中 容器对象名 add 组件对象名 演示例程 见LayoutNull java 6 面板容器及容器的嵌套 JPanel类 由于某一种布局管理器的能力有限 在设计复杂布局时通常采用容器嵌套的方式 即把组件添加到一个中间容器中 再把中间容器作为组件添加到另一个容器中 从而实现复杂的布局 JPanel类对象经常在构造复杂布局中作为中间容器 既可以把它放入其他容器中 也可以在其上放置其他容器和组件 但它不能单独显示 需要放到JFrame或Applet这样的顶层容器中 JFrame JApplet JDialog都默认有一个JPanel JPanel的构造方法 publicJPanel LayoutManagerlayout 创建一个面板对象 使用指定的布局管理器对象layout设置面板的布局 publicJPanel 使用缺省的布局管理器创建一个面板 面板的缺省的布局管理器是FlowLayout 也可以在创建面板对象后重新设置它的布局 方法也是使用面板对象的setLayout 方法 JPanel的常用方法 常用方法 voidsetSize intw inth voidsetVisible booleanb voidsetLayout LayoutManagerL 进行布局管理 面板容器及容器的嵌套 使用面板容器作为中间容器构建图形用户界面程序的一般思想是 先将组件添加到面板上 然后将面板作为一个组件再添加到顶层容器中 例 设计一个如图所示的图形界面 程序7 7FrameWithPanel java importjava awt importjavax swing publicclassFrameWithPanelextendsJFrame JPanelpanel 1 panel 2 publicFrameWithPanel super FrameWithPanel panel 1 newJPanel 设置面板的背景颜色为青色panel 1 setBackground Color CYAN 创建两个JPanel对象 在一个JPanel对象上放置三个按钮 再将此JPanel对象添加到框架内容窗格的南部 将另一个JPanel对象添加到窗口的中央即可 panel 2 newJPanel panel 2 setLayout newFlowLayout FlowLayout CENTER 20 10 panel 2 add newJButton Red panel 2 add newJButton Green panel 2 add newJButton Blue add panel 1 BorderLayout CENTER add panel 2 BorderLayout SOUTH setSize 300 200 setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE publicstaticvoidmain Stringargs FrameWithPanelframe newFrameWithPanel 图JComponent及其子类的层次结构 7 4常用组件简介 7 4常用组件简介 1 Frame JFrame 窗体容器向Frame中添加组件 可直接向Frame对象添加this add newButton 确定 向JFrame对象中添加组件 要先获取ContentPane对象 然后再使用add 方法把组件添加到ContentPane Conteinerc getContentPane c add newJButton 退出 7 4常用组件简介 2 JPanel Panel 面板容器 也称画布 白板 3 按钮 命令按钮 Button JButton 单选按钮 RadioButton JRadioButton RadioButtonGroup 按钮组 复选框 CheckBox4 JLabel Lable 标签主要用于显示字符串 输出一些信息及提示 5 文本框文本框即能输入又能输入字符串 而Lable只能输出 有三种文本框 单行文本框 TextField JTextField 多行文本框 TextArea JTextArea 口令框 PassWordField演示例程 testAlltext java 7 4常用组件简介 6 列表框 组合框列表框 JList List 下拉式列出选项 组合框 JComboBox CombBox 如同List 但最上面为可编辑区 可进行输入编辑 也可从下拉列表中选项到编辑区 演示例程 list combBox java7 其它组件滚动条 Slider 表格 Table 树 Tree 滚动栏 ScollBar 滚动面板 ScollPane 标签面板 TabbedPane 7 5事件处理 现代的图形用户界面程序都是事件驱动的 通过事件处理才能实现用户与程序的交互 本节主要介绍JavaGUI程序的事件处理模型 包括监听器的事件处理模型 和常见的事件处理方法 还将介绍JavaGUI编程中常用的组件 包括标签 按钮 文本框和菜单等 它们是图形用户界面程序中最基本的元素 1事件处理模型2事件类3事件监听器4事件处理的基本步骤5常见的事件处理6事件适配器类 7 5事件处理 1 事件处理模型 在Java1 1版之前事件处理采用事件传递模型 从Java1 1版开始 Java的事件处理采用了新的事件处理模型 称为事件代理模型 所谓事件代理模型就是将事件的处理从事件源对象代理给一个或多个称为事件监听器的对象 事件由事件监听器处理 事件代理模型把事件的处理委托给外部实体进行处理 实现了事件源和监听器分离的机制 事件代理模型 涉及三种对象 事件源 事件和事件监听器 事件源 EventSource 产生事件的对象 一般来说可以是组件 如按钮 对话框等 当这些对象的状态改变时 就会产生事件 事件源可以是可视化组件 也可以是计时器等不可视的对象 事件 Event 描述事件源状态改变的对象 如按钮被点击 就会产生ActionEvent动作事件 事件监听器 Listener 接收事件并对其进行处理的对象 事件监听器对象必须是实现了相应接口的类的对象 Java的事件代理模型 首先在事件源上注册事件监听器 当用户行为触发一个事件时 运行时系统将创建一个事件对象 然后寻找事件监听器对象来处理该事件 图GUI事件处理模型 2 事件类 为了实现事件处理 Java定义了大量的事件类 这些类封装了事件对象 Swing组件可产生多种事件 如点击按钮 选择菜单项会产生动作事件 ActionEvent 关闭窗口会产生窗口事件 WindowEvent 等 java util EventObject类是所有事件类的根类 该类的定义为 java util EventObject类 packagejava util publicclassEventObjectimplementsjava io Serializable protectedtransientObjectsource publicEventObject Objectsource if source null thrownewIllegalArgumentException nullsource this source source publicObjectgetSource returnsource publicStringtoString returngetClass getName source source 2 事件类 java awt AWTEvent是EventObject类的子类 同时又是所有组件AWT事件类的根类 该类中定义了getID 方法 它返回事件的类型 AWTEvent类的常用的子类定义在java awt event包中 其中常用的AWT事件类如下图所示 图常用的AWT事件类及层次关系 2 事件类 表1常用事件及产生事件的组件 3 事件监听器 事件的处理必须由实现了相应的事件监听器接口的类对象处理 Java为每类事件定义了相应的接口 事件类和接口都是在java awt event包中定义的 表2列出了常用的事件监听器接口 接口中定义的方法以及所处理的事件 接口中定义了一个或多个方法 这些方法都是抽象方法 必须由实现接口的类实现 Java程序就是通过这些方法实现对事件的处理的 表2事件监听器接口 方法及处理的事件 表2事件监听器接口 方法及处理的事件 4 事件处理的基本步骤 确定事件源和要处理的事件类型就是确定要处理哪些组件的什么事件 实现相应的监听器接口并创建监听器对象实现监听器接口可有多种方法 方法1 用内部类 推荐 方法2 在定义的类中用implements实现 方法3 用匿名内部类实现 说明 一个类可以实现一个接口 也可以实现多个接口 实现监听器接口必须实现接口中定义的所有方法 实现接口中定义的方法就是编写事件处理的代码 对于有多个方法的接口 系统还定义了事件适配器类 可以通过继承事件适配器类实现 4 事件处理的基本步骤 为组件注册监听器每种组件都定义了可以触发的事件类型 使用相应的方法为组件注册监听器 如果程序运行过程中 对某事件不需处理 也可以不注册监听器 甚至注册了监听器也可以注销 注册监听器publicvoidaddXXXListener XXXListenerl 注销监听器publicvoidremoveXXXListener XXXlistenerl 4 事件处理的基本步骤 说明 处理事件必须注册监听器 只有为组件注册了监听器后 在程序运行时 当发生该事件时才能由监听器对象处理 否则即使发生了相应的事件 事件也不会被处理 一个事件源 发生多种事件 由多个事件监听器处理 一个监听器对象 处理多个事件源的同一类型的事件 如下述程序两个按钮可以用一个监听器对象处理 4 事件处理的基本步骤 例 简单的事件处理程序 例程序7 8EventDemo java 功能是 点击 OK 按钮时 在文本框中显示 你点击了OK按钮 点击 Cancel 按钮时 在文本框中显示 你点击了Cancel按钮 图简单的事件处理程序 方法1 通过内部类实现监听器接口 程序7 8EventDemo javaimportjava awt importjava awt event importjavax swing publicclassEventDemoextendsJFrame JTextFieldtf JButtonbtn1 btn2 publicEventDemo super EventDemo tf newJTextField 15 btn1 newJButton OK btn2 newJButton Cancel setLayout newFlowLayout add tf add btn1 add btn2 ALlistener newAL 创建一个监听器对象btn1 addActionListener listener 为按钮注册监听器btn2 addActionListener listener setSize 350 100 setLocation 200 200 setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE classALimplementsActionListener 内部类publicvoidactionPerformed ActionEvente if JButton e getSource btn1 tf setText 你点击了OK按钮 修改文本框的内容elseif JButton e getSource btn2 tf setText 你点击了Cancel按钮 publicstaticvoidmain String args EventDemoframe newEventDemo 方法1 通过内部类实现监听器接口 方法2 通过当前类实现监听器接口 改写上面的程序用当前类对象本身作为监听器对象 需要修改的主要代码如下 见EventDemo1 java publicclassEventDemoextendsJFrameimplementsActionListener btn1 addActionListener this 为按钮注册监听器btn2 addActionListener this publicvoidactionPerformed ActionEvente if JButton e getSource btn1 tf setText 你点击了OK按钮 elseif JButton e getSource btn2 tf setText 你点击了Cancel按钮 方法3 通过匿名内部类实现监听器接口 使用匿名内部类可以在为组件注册监听器时直接定义类 对于上面的程序也可以使用匿名内部类实现 代码如下 btn1 addActionListener newActionListener 匿名内部类publicvoidactionPerformed ActionEvente tf setText 你点击了OK按钮 btn2 addActionListener newActionListener publicvoidactionPerformed ActionEvente tf setText 你点击了Cancel按钮 5 常见的事件处理 窗口事件最常用的窗口是JFrame对象 在窗口对象上可以发生如下7种事件 打开窗口 正在关闭窗口 关闭窗口 激活窗口 非激活窗口 窗口图标化和窗口还原事件 要处理窗口事件需实现WindowListener接口并为窗口对象注册事件监听器 下面的程序创建一个框架窗口 然后监听窗口事件 并在控制台打印出相应的信息 注意 这里编写了窗口关闭的程序 程序7 9WinEventDemo java importjava awt event importjavax swing publicclassWinEventDemoextendsJFrame publicWinEventDemo super WindowsEventDemo setSize 400 250 setLocation 200 200 setVisible true addWindowListener newWL 为窗口注册监听器 内部类classWLimplementsWindowListener publicvoidwindowOpened WindowEventwe System out println Windowisopened publicvoidwindowClosing WindowEventwe System out println Windowisclosing System exit 0 publicvoidwindowClosed WindowEventwe System out println Windowisclosed publicvoidwindowActivated WindowEventwe System out println Windowisactivated publicvoidwindowDeactivated WindowEventwe System out println Windowisdeactivated publicvoidwindowIconified WindowEventwe System out println Windowisiconified publicvoidwindowDeiconified WindowEventwe System out println Windowisdeiconified publicstaticvoidmain String args WinEventDemowed newWinEventDemo 2 常见的事件处理 鼠标事件 在一个组件上点击 松开 移动和拖动鼠标时 就会产生鼠标事件 共有下面7个鼠标事件 鼠标点击事件 鼠标按钮按下事件 鼠标按钮释放事件 鼠标进入组件事件 鼠标离开组件事件 鼠标移动事件 鼠标拖动事件 要处理鼠标事件必须实现相应的接口 有两个接口 一个是对应前5个事件的MouseListener接口 另一个是对应后两个事件的MouseMotionListener接口 表3MouseEvent类定义的常量 处理鼠标事件可以使

温馨提示

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

评论

0/150

提交评论