收藏 分享(赏)

电饭锅95388.ppt

上传人:dreamzhangning 文档编号:5753057 上传时间:2019-03-15 格式:PPT 页数:43 大小:1.26MB
下载 相关 举报
电饭锅95388.ppt_第1页
第1页 / 共43页
电饭锅95388.ppt_第2页
第2页 / 共43页
电饭锅95388.ppt_第3页
第3页 / 共43页
电饭锅95388.ppt_第4页
第4页 / 共43页
电饭锅95388.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

1、GUI (II)事件监听器,Chapter 13,回顾,javax.swing包中包含经过改进后的GUI组件,而java.awt包中则包括其它一系列与图形用户界面相关的类; 常用的基本Swing组件包括:JFrame、JButton、JLabel和JTextField等; 在手工编码中,一般使用布局管理器来定位组件,常用的布局管理器有:FlowLayout、BorderLayout和GridLayout等; 我们通常利用JPanel来实现嵌套布局,从而达到设计复杂界面的目的。,本章相关词汇,本章目标,解释Java中的事件授权处理模型 了解java.awt.event包 了解Java中常用的事件

2、类型 在Swing编程中实现事件处理,事件处理,对于采用了图形用户界面的程序来说,事件控制是非常重要的; 到目前为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能,要实现相应的功能,必须进行事件处理; 用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输入一个字符、点击鼠标等等; 当前我们要关注的并不是“事件是如何产生的”,而是讨论当发生事件后,我们应当“如何处理之”。,事件处理模型,Java中,事件处理的基本思路如下: 一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事

3、件; 一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知。,事件源与事件,当在一个图形用户界面点击鼠标或者按下键盘时,都是针对于具体组件而发生的动作,如:使用鼠标点击某个按钮;按下键盘向文本框输入内容等等; 我们把动作所操纵的对象称为事件源,请注意:事件源一定是指某个组件; 当针对于事件源发生动作时,就会产生一个事件。,监听器与监听器接口,针对每一类型的事件,都有与之相对应的监听器,用于监听事件的发生; 在Java中,监听器由一系列接口来提供; 实际上,事件监听器就是实现了事件监听接口的类,监听器不断监听事件源的动作,当事件源产生一个事件后,监听器接收到事件源的通知,就调用特定的

4、方法,以执行指定的动作。 特定的事件监听器只对特定的事件感兴趣。,java.awt.event包,java.awt.event包中包含了一系列与事件处理相关的类和接口,其中包括:监听器接口,事件对象和事件适配器等; 一般来说,编写图形用户界面程序都必须显式地导入此包; 每种事件监听器接口都是以类似于XxxListener的形式来命名的,如:ActionListener、MouseListener、ItemListener等;,ActionListener接口,按钮被点击是图形编程中最普遍的事件,我们经常要处理; ActionListener被称为活动监听器,一般用来监听按钮的点击事件; 该接口

5、中包含有一个抽象方法,原型如下:public void actionPerformed(ActionEvent ae);实现该监听器接口必须重写上面的方法。,案例1:按钮点击,实现界面代码,import java.awt.*; import java.awt.event.*; import javax.swing.*;public class EventDemo extends JFrame private JLabel lblMsg;private JButton btnClick;public EventDemo() lblMsg = new JLabel(“请点击下面的按钮.“);btn

6、Click = new JButton(“请点击我“);Container cpMe = getContentPane();cpMe.setLayout(new BorderLayout();cpMe.add(lblMsg, BorderLayout.CENTER);cpMe.add(btnClick, BorderLayout.SOUTH);setTitle(“ActionListener Demo“);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setResizable(false); /设置不允许用户自

7、行调整窗口大小setVisible(true);public static void main(String args) new EventDemo(); ,事件处理步骤1:确定事件源及监听器类型,由于我们想要处理按钮的点击事件,因此,按钮便是事件源; 监听器类型是ActionListener。,事件源,事件处理步骤2:实现监听器接口,编写类来实现监听器接口,并重写其中的抽象方法,如:class MyListener implements ActionListener public void actionPerformed(ActionEvent ae) 事实上,我们重写的这个抽象方法就是事件

8、处理函数。也就是说,当事件发生时,这个方法将自动调用,其中的代码将被执行; 但是,为了方便成员间的相互访问,我们一般采用内部类的方式来实现监听器。,事件处理步骤2:实现监听器接口(代码),import java.awt.*; import java.awt.event.*; /要进行事件处理,必须导入此包 import javax.swing.*;public class EventDemo extends JFrame private JLabel lblMsg;private JButton btnClick;public EventDemo() /构造方法,代码略/*采用内部类的方式实现

9、监听器接口*/private class MyListener implements ActionListener /*实现接口中的抽象方法,事件发生时,将自动调用此方法*/public void actionPerformed(ActionEvent ae) lblMsg.setText(“我被点击了!“); /设置标签中的文本public static void main(String args) new EventDemo(); ,附:内部类,内部类是Java独有的一种语法结构,即在一个类的内部定义另一个类,如:public class ExteriorClass private cla

10、ss InteriorClass 此时,内部类InteriorClass就成为外部类ExteriorClass中的成员,访问权限遵循类成员的访问权限机制,可以是public、protected、缺省和private; 内部类可以很方便地访问外部类中的其它成员; 内部类主要为了解决类成员间相互访问的问题,类似于C+中友元类的做法。,附:关于内部类的更多知识,内部类实际上是外部类的成员,如果在外部类以外需要实例化内部类对象的话,则必须通过外部类的实例才可以;注意:内部类可以直接访问外部类的成员,但外部类不可以直接访问内部类的成员。,class Outer /外部类public class Inne

11、r /内部类 public class InnerClassDemo public static void main(String args) Outer a = new Outer(); /实例化外部类的对象Outer.Inner b = a.new Inner();/通过外部类的实例创建其内部类对象 ,事件处理步骤3:事件源注册监听器,最后,我们要将事件源注册到监听器,也就是说,必须委派监听器去监听事件源所发生的事件; 每种类型的事件都有其自己的注册方法,一般形式为:void addXxxListener(XxxListener listener);这里的Xxx指代具体的事件类型,而lis

12、tener则是相应类型的监听器实例; 一般会采用如下形式将事件源注册到监听器:事件源.addXxxListener(监听器实例);如:btnClick.addActionListener(new MyListener();,事件处理步骤3:事件源注册监听器 (代码),import java.awt.*; import java.awt.event.*; import javax.swing.*;public class EventDemo extends JFrame private JLabel lblMsg;private JButton btnClick;public EventDemo

13、() /构造方法,代码略btnClick.addActionListener(new MyListener(); /将事件源注册到监听器/*内部类实现监听器接口*/private class MyListener implements ActionListener public void actionPerformed(ActionEvent ae) /实现事件处理函数lblMsg.setText(“我被点击了!“);public static void main(String args) new EventDemo(); ,事件的类型,实际上,事件是区分类型的,如:操作鼠标时会产生鼠标事件,

14、使用键盘输入字符时会产生键盘事件,窗体打开或关闭时会产生窗体事件等等; 对于不同类型的事件会有不同类型的监听器与之对应; java.awt.event包中包含了一系列监听器接口,分别用来处理不同类型的事件。,AWT事件类的继承体系,AWT事件类型(列表),常用监听器1:ActionListener,ActionListener可能是使用得最多的监听器,与之对应的事件类型是ActionEvent,一般在鼠标点击某个按钮时会产生该事件; 该接口只包含有一个抽象方法,其原型如下:其实现类必须重写actionPerformed方法,当事件发生时将调用该方法。,public interface Acti

15、onListener public void actionPerformed(ActionEvent ae); ,常用监听器2:KeyListener,KeyListener专门用来处理键盘事件,其对应事件类型是KeyEvent; 该接口中包含有三个抽象方法,分别在不同的时刻被调用,原型如下:,public interface KeyListener /*按下键盘上的某键时调用*/public void keyPressed(keyEvent ke);/*释放键盘上的某键时调用*/public void keyReleased(KeyEvent ke);/*输入某个字符时调用*/public

16、void keyTyped(KeyEvent ke); ,常用监听器3:MouseListener,操作鼠标时会产生鼠标事件MouseEvent,而MouseListener用来处理鼠标的动作,其原型:,public interface MouseListener /*鼠标按钮在某个组件上按下时调用*/public void mousePressed(MouseEvent me);/*鼠标按钮在某个组件上释放时调用*/public void mouseReleased(MouseEvent me);/*鼠标按钮在某个组件上点击(按下并释放)时调用*/public void mouseClick

17、ed(MouseEvent me);/*鼠标进入到某个组件的范围之内时调用*/public void mouseEntered(MouseEvent me);/*鼠标离开某个组件的范围之外时调用*/public void mouseExited(MouseEvent me); ,常用监听器4:MouseMotionListener,MouseMotionListener是专门处理鼠标运动事件的,比如将鼠标进行移动和拖动的时候,该接口的原型如下:,public interface MouseMotionListener /*在某个组件上移动鼠标时调用*/public void mouseMove

18、d(MouseEvent me);/*在某个组件上拖动(按下键并移动)鼠标时调用*/public void mouseDragged(MouseEvent me); ,常用监听器5:ItemListener,对于象下拉列表、单选按钮、复选按钮这些有选项的组件而言,当它们的选项发生改变的时候,都会产生选项事件ItemEvent,如果需要处理这样的事件,就用到了ItemListener,其原型:,public interface ItemListener /*当选项的状态(选择或取消)发生改变时调用*/public void itemStateChanged(ItemEvent ie); ,常用监

19、听器6:WindowListener,操作窗口时会产生窗口事件WindowEvent,其对应监听器是WindowListener,原型如下:,public interface WindowListener /*窗口被激活时调用*/public void windowActivated(WindowEvent we);/*窗口被禁止时调用*/public void windowDeactivated(WindowEvent we);/*窗口被关闭时调用*/public void windowClosed(WindowEvent we);/*窗口正在关闭时调用*/public void windo

20、wClosing(WindowEvent we);/*窗口最小化时调用*/public void windowIconified(WindowEvent we);/*窗口恢复时调用*/public void windowDeiconified(WindowEvent we);/*窗口打开时调用*/public void windowOpened(WindowEvent we); ,常用监听器7:FocusListener,某个组件得到/丢失焦点时将产生焦点事件FocusEvent,可以使用FocusListener来处理这样的事件,该接口原型:,public interface FocusLi

21、stener /*某个组件获得焦点时调用*/public void focusGained(FocusEvent fe);/*某个组件失去焦点时调用*/public void focusLost(FocusEvent fe); ,案例2:鼠标运动,实现界面代码,import java.awt.*; import java.awt.event.*; import javax.swing.*;public class MouseMotionDemo extends JFrame private JLabel lblN; /放置在北边的标签private JLabel lblS; /放置在南边的标签

22、public MouseMotionDemo() lblN = new JLabel(“请移动鼠标“);lblS = new JLabel(“请拖动鼠标“);Container cpMe = this.getContentPane();cpMe.setLayout(new BorderLayout();cpMe.add(lblN, BorderLayout.NORTH);cpMe.add(lblS, BorderLayout.SOUTH);this.setTitle(“MouseMotionListener Demo“);this.setDefaultCloseOperation(JFrame

23、.EXIT_ON_CLOSE);this.setSize(600, 400);this.setVisible(true);public static void main(String args) new MouseMotionDemo(); ,步骤1:确定事件源及监听器类型,我们要处理的是鼠标在窗体上移动/拖动时产生的事件,因此,窗体是事件源; 监听器类型是MouseMotionListener。,事件源是 整个窗体,步骤2:实现监听器接口,public class MouseMotionDemo extends JFrame private JLabel lblN;private JLabe

24、l lblS;public MouseMotionDemo() /构造方法,代码略/*内部类实现监听器接口*/private class MyListener implements MouseMotionListener /*接口中的抽象方法,必须实现,当鼠标移动时自动调用此方法*/public void mouseMoved(MouseEvent me) /*接口中的抽象方法,必须实现,当鼠标拖动时自动调用此方法*/public void mouseDragged(MouseEvent me) public static void main(String args) new MouseMot

25、ionDemo(); ,事件对象,Java中的所有事件都被封装在事件对象中,所有事件对象皆派生自EventObject类; 对于不同的事件类型会有不同的事件对象,它们都以类似于XxxEvent的方式命名,如:ActionEvent、MouseEvent等等; 事件对象中包含有事件发生时的相关信息(即事件触发时产生的一些数据),会被事件底层机制传递到事件处理函数中; 实际上事件对象就是事件处理函数中被传递进来的参数,如果在处理事件的过程中需要使用到相关的某些数据,可以从事件对象中获取。,java.awt.event.MouseEvent的常用方法,事件处理代码,/*内部类实现监听器接口*/ pr

26、ivate class MyListener implements MouseMotionListener /*接口中的抽象方法,必须实现,当鼠标移动时自动调用此方法*/public void mouseMoved(MouseEvent me) int x = me.getX(); /得到鼠标位置的x坐标int y = me.getY(); /得到鼠标位置的y坐标/将鼠标坐标信息显示到北边的标签中String str = “正在移动鼠标X:“ + x + “,Y:“ + y;lblN.setText(str);/*接口中的抽象方法,必须实现,当鼠标拖动时自动调用此方法*/public void

27、 mouseDragged(MouseEvent me) int x = me.getX(); /得到鼠标位置的x坐标int y = e.getY(); /得到鼠标位置的y坐标/将鼠标坐标信息显示到南边的标签中String str = “正在拖动鼠标X:“ + x + “,Y:“ + y;lblS.setText(str); ,事件对象,事件对象,步骤3:事件源注册监听器,public class MouseMotionDemo extends JFrame private JLabel lblN;private JLabel lblS;public MouseMotionDemo() /构造

28、方法/将窗体注册到鼠标运动监听器this.addMouseMotionListener(new MyListener();/*内部类实现监听器接口,代码略*/private class MyListener implements MouseMotionListener public static void main(String args) new MouseMotionDemo(); ,实现事件处理的其他方式,事实上,Java语言的语法自由度很大; 要进行事件处理,除了使用内部类的方式以外,还可以: 直接实现的方式; 匿名类的实现方式。,直接实现的方式进行事件处理,/*继承于JFrame类,

29、并实现MouseMotionListener接口不但具备窗体的功能,同时又是一个监听器*/ public class MouseMotionDemo extends JFrameimplements MouseMotionListener /声明窗体中的组件,代码略public MouseMotionDemo() /构造方法,代码略this.addMouseMotionListener(this); /将事件源注册到监听器/*实现MouseMotionListener接口中的鼠标移动方法,代码略*/public void mouseMoved(MouseEvent me) /*实现MouseM

30、otionListener接口中的鼠标拖动方法,代码略*/public void mouseDragged(MouseEvent me) ,匿名类的方式进行事件处理,public class MouseMotionDemo extends JFrame /声明窗体中的组件,代码略public MouseMotionDemo() /构造方法,代码略/*将事件源注册到监听器,监听器用匿名类实现*/this.addMouseMotionListener(new MouseMotionListener() /实现MouseMotionListener接口中的鼠标移动方法,代码略public void

31、mouseMoved(MouseEvent me) /实现MouseMotionListener接口中的鼠标拖动方法,代码略public void mouseDragged(MouseEvent me) );public static void main(String args) ,匿名类,匿名类其实就是一种比较特殊的内部类,只是这个类没有名字而已; 匿名类与内部类相似,能够访问到外部类中的所有成员; 很多情况下(特别是在事件处理中),匿名类一般被定义在外部类的某个方法中,所以也被称为局部内部类,对于局部内部类,它还可以访问到这个方法的参数; 在适当的情况下,使用匿名类来实现事件处理,会使代码更简洁,更灵活。,总结,与事件处理相关的三个概念:事件源、监听器、事件对象; 在程序中要进行事件处理的话,需要导入java.awt.event包; 事件处理的三个步骤: 确定事件源和监听器类型 实现监听器接口 将事件源注册到监听器 事件处理的三种语法实现形式: 内部类的实现方式 匿名类的实现方式 直接实现的方式,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报