Java语言程序设计-图形用户界面设计(2)

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
多元評量與 Greenfoot 簡介 南港高中高慧君. 演講大綱 多元評量 高中階段程式設計教學目標與困境 Greenfoot 快速入門 – 袋熊吃樹葉 – 沙灘螃蟹 Greenfoot 臺灣社群介紹 2.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《 Java开发环境配置》 主讲人:耿力.
Java 2实用教程(第3版)教学课件 主讲教师:张国平
JAVA程序设计 天津工程职业技术学院计算机工程系软件技术教研室.
Java程序设计教程 第一讲 Java概述.
Java程序设计 常州信息职业技术学院(CCIT) 软件学院
四資二甲 第三週作業 物件導向程式設計.
Java System Concepts and Animation Programming
第12章 JDBC数据库应用程序设计.
第二十章 圖型介面與網路對播 (GUI and Intercross Transition) 20-1 簡介 20-2 ActionListener Interface 20-3 ActionEvent Class 20-4 Vector Class 20-5 圖型介面與視窗關閉 20-6 圖型介面與資料顯示.
視窗程式設計 2. 視窗版面配置 Chih Hung Wang Reference:
6.5 图形界面的布局设计 每一个容器组件都有一个默认的布局管理方式,也可以用setLayout方法来设置其他布局管理器。一旦确定了布局管理方式,容器组件就可以用add方法加入组件。 布局管理器用来确定组件在容器中的位置和大小,AWT中定义了布局管理器接口LayoutManager的实现类来实现此功能。
第11章 Java多媒体技术.
第七章 图形用户界面的设计与实现 学习导读 首先,我们学习一些基本的图形编程知识,包括窗口的显示及外观设置、在窗口中显示文字和图像等;
第6章 图形用户界面设计 6.1 图形用户界面概述 6.2 GUI标准组件的使用 6.3 Java的事件处理 6.4 窗口及菜单设计
第 18 章 圖形使用者介面.
第三部分 Java语言编程应用篇 第6章 Java语言的 图形用户界面开发技术 (之二).
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
Ch07 介面與多重繼承 物件導向程式設計(II).
AOP实践 演讲人:陈思荣.
第三章 控制结构.
Java语言程序设计 马 皓
Ch06 人機介面_視窗程式設計(2) 物件導向系統分析與設計.
第9章 图形用户界面(GUI)设计.
Ch02 視窗Swing套件 物件導向系統實務.
程式設計實作.
GUI事件处理 主讲:赖国荣 QQ:
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
JAVA语言程序设计 第9章 图形用户界面 郑 莉.
问题 Jdbc连接数据库 下载数据库的驱动 Sql server 在微软的网站上可以下载 Sqlserver for jdbc driver
2018/11/15 面向对象与多线程综合实验-GUI设计 教师:段鹏飞.
Ch07 Java Applets 物件導向系統實務.
Java程序设计 JAVA 授课教师:赵小敏 浙江工业大学 软件学院
SWING 2018/11/23.
SWT-JFace 南京大学软件学院
CH09 套件 物件導向程式設計(II).
記事本 物件導向系統實務.
第九章 窗口、菜单和对话框 本章的任务: 介绍图形用户界面的高级组件。这些组件包括窗口、菜单和对话框等,它们可以构造出标准GUI应用程序。最后,简要介绍Java Swing的使用方法。
記事本 物件導向系統實務.
JAVA 2 新觀念教本 ---邁向SCJP專業認證--- 易瓏資訊 林新德 著.
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
AWT Event Model.
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Ch04 事件處理 物件導向系統實務.
CH03 為自己的視窗加上小元件 物件導向系統實務.
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
4、按钮事件.
CH04 視窗中元件排排坐 物件導向系統實務.
C/C++/Java 哪些值不是头等程序对象
事件處理.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第十章 基于Swing的图形用户界面设计.
Multithread 多執行緒 以GUI為例了解物件以及Event
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第二章Java基本程序设计.
第五章 事件处理机制 Java 事件处理机制 窗口事件 鼠标事件 键盘事件 例:ButtonTest.java.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第十二章 JFC/Swing 概述  Swing组件  Swing应用程序结构  JComponent类.
第二章 Java基本语法 讲师:复凡.
第6章 面向对象的高级特征 学习目标 本章要点 上机练习 习 题.
第2章 Java语言基础.
迴圈(重複性結構) for while do while.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
Summary
Presentation transcript:

Java语言程序设计-图形用户界面设计(2) 2018/11/6 Java语言程序设计-图形用户界面设计(2) 教师:段鹏飞

1、内部类与匿名类的特点 2、编写事件程序的流程 3、能够编写事件处理程序 2018/11/6 知识点 1、内部类与匿名类的特点 2、编写事件程序的流程 3、能够编写事件处理程序

试验时间:改到第12周周一12:00-16:00 设计实现一个window版计算器 实验 要求: 1)参考Windows中的计算器; 2)使用面向对象的思想,应用继承和多态; 2)将最后的界面截图贴在实验报告上。

容器的嵌套 一个JPanel容器,包含一个JLabel标签 一个JPanel容器, 包含了确定和取消按钮。

每个布局管理器都有自己特定的用途。 布局类型的选用 要按行和列显示几个同样大小的组件,GridLayout 会比较适合。 要在尽可能大的空间里显示一个组件,就要选择 BorderLayout 。 当需要在水平和垂直方向上把组件排列整齐时,需要选用GridBagLayout 。 FlowLayout 流式布局 可以让组件全部显示在窗体或者容器上,按照组件添加的先后顺序显示,排列满一行之后自动排列到下一行,缺点是:改变容器大小,组件相对位置会发生变化 BorderLayout 麻将布局 使用绝对的东南西北中位置来放置组件,有点是:容器形状变化,组件相对位置不会变化,缺点是,如直接使用,则只能放置5个组件 GirdLayout 网格布局 用户可以按照自己的需要,将容器划分为等大的网格,优点是:不受组件数量的限制,缺点是:每个组件会占据网格全部的大小,自身的尺寸无法体现 BoxLayout 盒式布局 通过横向放置或者纵向放置的盒子以及横纵向支撑来布局,界面相对美观 null 空布局,用户可以将组件按照自己所需的任意位置摆放,缺点是:如不借助工具,则需要很详细计算组件位置及其大小

联合使用布局管理器 容器的嵌套 一个包含了多个组件的容器本身可以作为一个组件加到另一个容器中去,容器中再添加容器,这样就形成了容器的嵌套。 多面板技术 将窗口分割成多个独立的面板,每个面板独立布局(即为每个面板分别设置不同的布局管理器),然后再使用另一种布局管理器来组织这些面板。

边界 界面上的组件较多时,需要从视觉上将组件分隔。 通用办法是为面板设置边界,再将组件添加到该面板中。 边界风格包括:低斜面、凸斜面、蚀刻、直线、不光滑、空。 NCEPU

创建所需的边界后,把边界对象添加到组件中。 Panel1.setBorder(border); 创建边界需要调用BorderFactory的静态方法。 Border border = BorderFactory.createEmptyBorder(); 创建所需的边界后,把边界对象添加到组件中。 Panel1.setBorder(border); 当需要给边界增加标题以提示时,可以使用BorderFactory的createTitledBorder方法: //初始化带标题的空边界。 Border border = BorderFactory.createEmptyBorder(); Border titled = BorderFactory.createTitledBorder (border, "Border types"); BorderFactory提供了以下方法: -------------------------------------------------------   static Border          creatBevelBorder(int type)建立一个立体的边界,并由参数type指定为凹陷或突起,type可为                           BevelBorder.LOWERED表示凹陷,或是BevelBorder.RAISED表示突起。   static Border          createBevelBorder(int type,Color highlight,Color shadow)建立一个立体的边界,并指定突边与阴                           影的颜色。   static Border          createBevelBorder(int type,Color highlightOuter,Color highlightInner,Color shadowOuter                           ,Color shadowInner)建立一个立体的边界,并指定内外部的突边与阴影的颜色。   static CompoundBorder  createCompoundBorder()建立一个复合边界。   static CompoundBorder  createCompoundBorder(Border outsideBorder,Border insideBorder)建立一个复合边界,并指定它                          的内外边界。   static Border          createEmptyBorder()建立一个空的边界。   static Border          createEmptyBorder(int top,int left,int bottom,int right)建立一个空的边界,并指定上下左右                          的宽度,在这些宽度中不能作绘图的效果。   static Border          createEtchedBorder()建立一个四周有凹痕的边界。   static Border          createEtchedBorder(Color highlight,Color shadow)建立一个四周有凹痕的边界,并指定突边与阴影                          的颜色。   static Border          createLineBorder(Color color)                          建立一个线务边界,并指定线条的颜色。   static Border          createLineBorder(Color color,int thicness)                          建立一个线务边界,并指定线条的颜色与宽度。   static Border          createLoweredBevelBorder()建立一个具有凹陷效果的边界,意义与                          createBevelBorder(BevelBorder.LOWERED)相同。   static MatteBorder     createMatteBorder(int top,int left,int bottom,int right,Color color)建立一个垫子边界,这跟                          createEmptyBorder有点像,但可以指定边界颜色。   static MatteBorder     createMatteBorder(int top,int left,int bottom,int right,Icon tileIcom)建立一个垫子边界,并                          指定边界的花纹。   static Border          createRaisedBevelBorder()建立一个具有突起效果的边界,意义与createBevelBorder(BevelBorder.                          RAISED)相同。   static TitledBorder    createTitledBorder(Border border)建立一个标题边界,但没有标题名称。   static TitledBorder    createTitledBorder(Border border,String title)建立一个标题边界,并指定标题名称,标题默认位                          置是TitledBorder.DEFAULT_JUSTIFICATION与TitledBorder.DEFAULT_POSITION,也就是左上方。   static TitledBorder    createTitledBorder(Border border,String title,int titleJustification,int titlePosition)                          建立一个标题边界,并指定标题名称与标题位置,参数titleJustification可为:                          TitledBorder.LEFT                          TitledBorder.CENTER                          TitledBorder.RIGHT                          TitledBorder.DEFAULT_JUSTIFICATION(leading)                          参数titlePosition可为:                            TitedBorder.ABOVE_TOP                            TitledBorder.TOP(sittin on the top line)                            TitledBorder.BELOW_TOP                            TitledBorder.ABOVE_BOTTOM                            TitledBorder.BOTTOM(sitting on the bottom line)                            TitledBorder.BELOW_BOTTOM                            TitledBorder.DEFAULT_POSITION(top)   static TitledBorder    createTitledBorder(Border border,String title,int titleJustification,int titlePosition,                           Font titleFont)建立一个标题边界,并指定标题名称,标题位置与字体。     static TitledBorder    createTitledBorder(Border border,String title,int titleJustification,int titlePosition,                           Font titleFont,Color titleColor)建立一个标题边界,并指定标题名称,标题位置、字体与标题颜                           色。   static TitledBorder    createTitledBorder(String title)建立一个标题边界,并指定标题名称,其他为默认值。 BorderDemo.java import javax.swing.border.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class BorderDemo{     public static void main(String[] args){       JFrame f=new JFrame("BorderDemo");       Container content=f.getContentPane();       JLabel label=new JLabel();       //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));//凹陷效果       //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));//突起效果             //凹陷效果,并设置突出与阴影的颜色       //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.red,Color.blue));             //凹陷效果,并设置内外部突出与阴影的颜色       //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.red,Color.blue,Color.yellow,Color.green));             /*EmptyBorder:建立一个空的边界,可指定边界的宽度,这在区隔组件之间的距离时可能用到。        *EtchedBorder:建立一个四周有凹痕的边界,也可以指定突边与阴影的颜色.        */       //label.setBorder(BorderFactory.createEtchedBorder());              //设置四周有凹痕的边界,并指定内外部的突边与阴影的颜色       //label.setBorder(BorderFactory.createEtchedBorder(Color.red,Color.blue));             //LineBorder:建立一个线条边界,并可以指定线条的颜色与宽度。       //label.setBorder(BorderFactory.createLineBorder(Color.blue,5));             //MatteBorder:建立一个Matte边界,这个方法与createEmptyBorder()有点像,但可以指定边界颜色       //或利用Icon产生边界花纹.       //label.setBorder(BorderFactory.createMatteBorder(5,5,5,5,Color.green));                   //label.setBorder(BorderFactory.createMatteBorder(25,25,25,25,new ImageIcon(".\\icons\\star.gif")));             /*CompoundBorder: 建立一个复合边界,并可以指定它的内外边界,例如我们可以指定它的外边界为LineBorder,        *它的内边界为MatteBorder。        */            //label.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.blue,5),       //                BorderFactory.createMatteBorder(20,20,18,18,new ImageIcon(".\\icons\\star.gif"))));             //TitleBorder:建立一个标题边界,我们可以指定边界的标题名称、标题位置、字体与标题颜色。       //label.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.blue,5),"Line Border"       //                ,TitledBorder.LEFT,TitledBorder.TOP));             label.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.blue,5),"Line Border"                       ,TitledBorder.LEFT,TitledBorder.ABOVE_TOP,new Font("SansSerif",Font.ITA_LIC,14),Color.red));       content.add(label);       f.setSize(200,150);       f.show();       f.addWindowListener(new WindowAdapter(){       public void windowClosing(WindowEvent e){          System.exit(0);       }       });     } }

边界的实例 import javax.swing.*; import javax.swing.border.*; class borderE { public static void main(String[] args) { JPanel p1=new JPanel(); Border border=BorderFactory.createLoweredBevelBorder(); Border borderTitled= BorderFactory.createTitledBorder(border,"打印范围"); p1.setBorder(borderTitled); JFrame f=new JFrame(); f.add(p1); f.setSize(200,200); f.setVisible(true); }

在设计和实现图形用户界面的过程中, 主要完成两个任务: 回顾 - Java的GUI设计 在设计和实现图形用户界面的过程中, 主要完成两个任务: 创建窗口并在窗口中添加各种组件,指定组件的属性和它们在窗口中的位置,从而构成图形界面的外观效果 定义图形界面的事件和各种组件对不同事件的响应,从而实现图形界面与用户的交互

一般可按照下列流程进行 回顾 - Java的GUI设计 引入Java图形组件包 AWT、Swing 选择“外观和感觉” 设置窗体属性 设置组件布局 向窗体中添加组件 对组件进行事件处理 鼠标获得专利 – 40周年 微软win3.0(GUI) – 约20年

“交互”的实现 回顾 –实现GUI步骤示意 如何判断“按钮”变化 如何实现按下以后 的工作 窗体: Frame类对象 下拉菜单: Menu类对象 文本框: TextField类对象 “交互”的实现 如何判断“按钮”变化 如何实现按下以后 的工作 鼠标、键盘是人对计算机的输入(键盘、鼠标、按钮、菜单的等); 程序后台处理是机器的对用户输入的处理; 显示的变化是机器的反馈; 共同构成了“人-机”交互,习惯上称之为“交互事件”。 举例,word的右键弹出菜单、选中文本等。 “今天学习Java“人-机”交互的机制和实现”。 按钮: Button类对象 内容面板: Panel类对象

内容提要 内部类 事件定义 交互处理方式 事件机制 程序实现

Java中的内部类 写法是否正确? 内部类是附属于外部类的实例的,它们只能与外部类的实例一起存在。 内部类的方法可以直接访问外部类的私有变量和方法

事件概述 事件的定义 日常生活:电话铃响、门铃响、汽车启动 计算机:鼠标点击、键盘按键、窗口关闭、窗口移动、 窗口最大化、拖动、鼠标经过等

处理“人-机”交互的两种方式 两种处理方式进行比较的内容 交互处理方式分析 查询处理方式 事件处理机制 如何“查询” C等传统语言的方式 主要用于Dos等命令行环境下程序设计 事件处理机制 Java、Visual C++的方式 主要用于Windows程序和多线程程序设计 两种处理方式进行比较的内容 如何“查询” 软件设计人员的需要完成的工作 此页要改! 1.以往命令行(C语言)程序处理,不是现在windows那样同时运行多道程序, 独占资源运行,采用if…then..else…方式,判断“如果发生A则..;否则…”;如果 可能发生很多事件,则嵌套很深。”scanf时只处理键盘输入,而不处理鼠标“ 不足:这个”判断事件-选择处理方法-进行处理“ 2.Windows环境下软件,

看护小宝宝“换尿布”的方式 比 较 程序设计的思路:查询 -> 报告 两种方式比较 - 如何“查询” 传统方法:每过一会就摸摸... 如果尿布湿了,换新的 新方法:尿布自动报警器(湿敏电阻) 比 较 工作方式: 由 “监测->处理” 变为 “提醒告知” 新方法优点:提高并发度、效率 新方法缺点:提高了复杂度 (价格...) 程序设计的思路:查询 -> 报告

老板来了 员工如何实现老板来公司的监控?

“查询”方式下软件设计者要完成的工作 两种方式比较 - “程序员的工作” 例. 如何处理鼠标的多种操作 实现方式 设计工作 缺点 “查询” 对操作类型逐个比较 设计工作 判断发生交互种类 设计“处理”代码 “交互”和”处理”代码的组织方式 缺点 需编程判断交互类型 “交互”和”处理“的 代码交织在一起 While (true) do{ /*查询鼠标操作*/ } if (用户单击了鼠标左键) Then {进行方式一处理} else if (用户单击了鼠标右键) Then {进行方式二处理} else if (用户双击了鼠标左键) Then {进行方式三处理} 此页要改! 1.以往命令行(C语言)程序处理,不是现在windows那样同时运行多道程序, 独占资源运行,采用if…then..else…方式,判断“如果发生A则..;否则…”;如果 可能发生很多事件,则嵌套很深。”scanf时只处理键盘输入,而不处理鼠标“ 不足:这个”判断事件-选择处理方法-进行处理“ 2.Windows环境下软件, else . . .

老板来了 公司 ② 打电话 公司前台 确定好电话内容 通知员工 ③ 拨号 ④ 给老板检查 ① 来公司 老板

事件处理 事件处理过程 GUI界面 ② 创建 Java运行时系统 事件对象 事件处理(监听)对象 ③ 传递 ④ 回馈 ① 触发 事件源

事件概述 用户和程序的交互原理 用 户 GUI 程 序 ① 触发事件 ② 处理事件

事件驱动流程图 事件概述 开 始 处理事件 创建图形用户界面(GUI) 否 有事件处理程序 ? 等待事件 是 用指定程序 处理该事件 是 关闭程序事件 ? 结 束 处理事件 是 否 处理事件 有事件处理程序 ? 返 回 是 否 用指定程序 处理该事件

事件的构成 事件概述 以“用户点击按钮”事件来说明事件三要素: GUI界面 Java运行时系统 事件源button ① 点击 ② 创建 事件对象 事件处理(监听)对象 ③ 传递 ④ 回馈 ① 点击

2.1 事件机制的几个概念 事件源 描述人机交互中事件的来源 (EventSource) 通常是Java图形包中组件 事 件 事件源产生的交互内容,如“按下鼠标” (ActionEvent) 在 java.awt.event包中定义的类 事件监听器 接收事件并进行处理,由程序员编写 (ActionListener) 对应处理所监听事件源产生的事件 监听器接口 编写“事件监听器”的“规定” – “抽象方法” 必须在监听器类中实现这些方法完成事件处理 监听器注册 将事件监听器对象绑定到事件源,进行监听

事件程序实现

事件处理过程 AWT、SWING 事件对象 事件源 监听器注册 监听器 监听器接口 ActionEvent e 事件对象 事件源 监听器注册 监听器 监听器接口 class ButtonListener implements ActionListener { public void actionPerformed( ) { /** 按钮事件所进行的具体工作 **/ }

事件类型 典型触发动作 2.2 常用事件类 ActionEvent 按钮、列表双击、单击菜单项目 KeyEvent 键盘的输入 MouseEvent 鼠标拖动、移动、单击、按下、释放或者进入、退出组件的事件 ComponentEvent 组件被隐藏、移动、尺寸调整或变为不可见的事件 FocusEvent 组件获得或失去焦点的事件 InputEvent 复选框和列表项单击、控件的选择和可选菜单项的选择事件 TextEvent 文本区域或者文本区域的值的改动 WindowEvent 窗口激活、失去活动窗口、最小化、最小化、打开、关闭或者退出的事件

AWT:事件类包含在java.awt.event中 Swing:事件类包含在javax.swing.event中 java.util.EventObject类是所有事件类的父类 粉色标记为“高级事件” 蓝色标记为“低级事件”

事件类的继承层次关系 “事件”的编程实现: 基于Java封装的系统类 详细内容见软件包 java.awt.event

2.3 事件监听器 如何编程实现监听器 ? 每一个事件类都有唯一的事件处理方法接口, 例如,对于处理鼠标事件“ActionEvent”类的对应 接口为“ActionListener” 每一个接口中都已经规定了一个空的抽象方法 在该方法中编码实现自己想做的的工作 事件监听器设计进行的两步工作 1.实现监听器 2.绑定到组件

Java语言中没有提供专门的事件监听器类,而是提供包含事件处理方法的监听器接口 事件监听器接口 Java语言中没有提供专门的事件监听器类,而是提供包含事件处理方法的监听器接口 针对不同的事件类,提供了不同的事件监听器接口 例如:与键盘事件KeyEvent对应的监听器接口为:KeyListener public interface KeyListener extends EventListener {   public void keyPressed(KeyEvent ev);   public void keyReleased(KeyEvent ev);   public void keyTyped(KeyEvent ev); } 说 明:  java.util.EventListener是所有事件监听器接口的父接口;  在KeyListener接口中定义了三个抽象方法: (1)当键盘按键被按下时,将调用keyPressed()方法来处理事件; (2)当键盘按键弹起时,将调用keyReleased()方法来处理事件; (3)当键盘按键被敲击(按下并迅速弹起)时,将调用keyTyped()方法来处理事件。 注:事件监听器接口是系统已经定义好的,用户不需要自行定义。

事件类型 典型动作 2.3 常用事件监听器类 ActionListener 处理按钮、列表双击、单击菜单项目 KeyListener 处理键盘的输入 MouseListener 处理鼠标拖动、移动、单击、按下、释放或者进入、退出组件的事件 ComponetListener 处理组件被隐藏、移动、尺寸调整或者变为不可见的事件 FocusListener 处理组件获得或失去焦点的事件 TextListener 处理文本区域或者文本区域的值的改动 WindowListener 处理窗口激活、失去活动窗口、最小化、最小化、打开、关闭或者退出的事件

如何编程实现监听器 ? 2.3 事件监听器 专业训练 医 生 掌握医疗技术 普通人 监听器类 实现指定接口 指定抽象方法 自编类 如何编程实现监听器 ? 医 生 专业训练 掌握医疗技术 普通人 监听器类 实现指定接口 指定抽象方法 自编类 事件监听器设计进行的两步工作 1.实现监听器 2.绑定到组件

“事件源-监听器-抽象方法”对应 事件类型 监听器名称 抽象方法 (必须实现) ActionListener ActionEvent ActionListener actionPerformed(ActionEvent) KeyEvent (键盘事件) KeyListener (键盘监听器) 按 下 释 放 按+放 MouseEvent (鼠标事件) MouseMotionListener (鼠标移动监听器) 移 动 拖 动 MouseListener (鼠标按键监听器) 进 入 退 出 . . . keyPressed(keyEvent) keyReleased(keyEvent) keyTyped(keyEvent) mouseMoved(MouseEvent) mouseDragged(MouseEvent) mousePressed(mouseEvent) mouseReleased(mouseEvent) mouseEntered(mouseEvent) mouseExited(mouseEvent)

事件模型组件 例:定义KeyEvent监听器类 public class 监听器类名 implements KeyListener { public void keyPressed(KeyEvent ev) System.out.println(“键盘被按下!”); } public void keyReleased(KeyEvent ev) public void keyTyped(KeyEvent ev)

通过观察 “addxxxListener” 方法的名称, 可以很容易地知道其能够处理的事件类型 事件监听器.续 如何将监听器绑定到组件 ? 每个组件都提供了用于绑定监听器的方法 通过观察 “addxxxListener” 方法的名称, 可以很容易地知道其能够处理的事件类型 绑 定 “binding”

注册事件监听器 注册监听器语法: 注销监听器语法: 事件源对象 . addXxxListener (XxxListener对象); 事件源对象 . removeXxxListener (XxxListener对象);

单事件源的“多个事件” 学生可发生多种事件 学生的生活中,可能发生... 开导帮助 讲 解 “噗!” “哎呦...” 生病了 学习困难 生活困难 讲 解 开导帮助

分析: “单事件源-多事件”处理 学 生 事件源 事 件 监听器 治 疗 开导帮助 讲 解 左键 单击 鼠标 监听 鼠标操作 键入 文本 学习问题 生活困难 生 病 教 师 辅导员 医 生 治 疗 开导帮助 讲 解 事件源 文本框 左键 单击 鼠标 监听 鼠标操作 键入 文本 按键 监听 输入文本 变换 焦点 监听 焦点变换 事 件 监听器 具体工作

getSource()方法得到发生点击事件的按钮对象。 if(e.getSource == btnOK) … 事件处理 getSource()方法得到发生点击事件的按钮对象。 if(e.getSource == btnOK) … getActionCommand()方法得到被点击按钮的文字。 if(e.getActionCommand().equals(“确定“))

按钮事件处理示例 import javax.swing.*; import java.awt.event.*; public class MyFrame extends JFrame implements ActionListener{ JButton btnOK,btnCancel; JLabel lab; MyFrame(String s){ super(s);setSize(200,200);this.setLocationRelativeTo(null); JPanel pan = new JPanel();setContentPane(pan); btnOK = new JButton("OK"); btnOK.addActionListener(this); btnCancel = new JButton("Cancel"); btnCancel.addActionListener(this); lab = new JLabel(" "); pan.add(btnOK); pan.add(btnCancel); pan.add(lab); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible( true ); } public void actionPerformed(ActionEvent e){ if(e.getSource()==btnOK) lab.setText("点击了确定按钮"); if(e.getActionCommand() .equals("Cancel")) lab.setText("点击了取消按钮");

事件处理 实现事件处理的步骤 创建事件监听器类 创建事件监听器对象 注册事件监听器

匿名类的方式实现事件处理

匿名类 匿名类的定义 顾名思义就是未被命名的类 匿名类的特征 在程序中只使用(即:被实例化)一次

事件适配器类的特征 事件适配器类 适配器类就是一个特殊的事件监听器类 Java语言只针对包含多个抽象方法的监听器接口,提供了相应的XXXAdapter(适配器) 比如:WindowListener接口的适配器类是WindowAdapter

程序功能需求 解决方法 程序设计.例一 绘制一个窗体 窗体内绘制一个按钮,名为“点我” 按下按钮时,在命令行打印信息 打印内容为 “我知道你按下按钮啦!” 解决方法 设计自己的带有按钮的窗体类 (派生自Java.awt.Frame类) 设计自己的按钮事件监听器类 (实现ActionListener接口、并完成ActionPerformed方法) 创建按钮事件监听器类对象,并绑定到“按钮”上 (调用按钮类的 addActionListener方法)

事件处理例1.代码 设计自己的窗体类 按钮 事件源 注册监听器 主类 监听器类 import java.awt.*; import java.awt.event.*; class ButtonListener implements ActionListener { public void actionPerformed ( ActionEvent e ) { System.out.println ( “我知道你按下按钮啦“ ); } 按钮 窗体 主类 监听器 监听器类 class myButtonFrame extends Frame { Button btn; myButtonFrame(String s) { //构造函数 super(s); this.setSize(200,120); /* 创建按钮*/ btn = new Button("点击"); this.add(btn); // 事件监听器创建和注册 ButtonListener bl = new ButtonListener(); btn.addActionListener(bl); } 设计自己的窗体类 按钮 事件源 注册监听器 public class ActionEventTest { // 主类 public static void main(String args[]){ myButtonFrame frm = new myButtonFrame("ActionEventTest"); frm.show(); // 显示窗体 } 主类

程序设计. 例一. 运行结果

菜单组件 菜单和对话框 不能将菜单组件直接添加到一般的容器中 不能使用布局管理器对它们进行布局 AWT提供的菜单机制是这样的:一个容器包含一个菜单条,一个菜单条中包含多个菜单,一个菜单中包含多个菜单或菜单项 和菜单相关的组件有四个:MenuBar, Menu, MenuItem, CheckboxMenuItem.

菜单条(MenuBar) 一个菜单条组件是一个水平容器,并作为所有菜单树的根。 一个窗体中只可以显示一个菜单条。 菜单条不能注册任何监听者。 例如: Frame fr = new Frame(); MenuBar mb = new MenuBar(); f.setMenuBar(mb)

菜单(Menu) 菜单组件提供了一个基本的下拉式菜单,它可以加入到一个菜单条或者另一个菜单中。 例如: MenuBar mb = new MenuBar(); Menu mu1 = new Menu(“File”); Menu mu2 = new Menu(“Edit”); mb.add(mu1); mb.add(mu2); f.setMenuBar(mb);

菜单项(MenuItem) 菜单项组件通常被加入到菜单中,以构成一个完整的菜单。 通常,将一个ActionListener注册到一个菜单项对象中,接收和处理选中菜单项的事件。 例如: Menu mu = new Menu(“File”); MenuItem mi1 = new MenuItem(“New”); MenuItem mi2 = new MenuItem(“Load”); mu.add(mi1); mu.add(mi2);

本节课我们学习了 经验与建议 事件机制的功能 (Why: 为什么需要…) 事件机制架构和流程 (What:什么是…) 事件机制的编程实现 (How: 怎么创建…) 经验与建议 “最有用” 的Java资料 – JDK API手册 “最有效” 的学习方法 – 亲手编程、调试

作业与练习 如何来制作图形界面?它需要引入哪些包 在java中,什么是事件?简述处理事件的机制。 什么是布局管理器,它有什么作用? 请编写一个窗口来实现BorderLayout的布局。 请说明FlowLayout布局方式的特点? GridLayout布局的特点有哪些?

2018/11/6 谢谢