JAVA程序员培训定制课程c11.ppt
第十一章,GUI事件处理,2,本章内容,Java事件和事件处理事件源、事件监听器、事件类型事件监听器接口和事件适配器内部类和匿名类在Java事件处理中的应用,3,什么是事件?,事件(Event)一个对象,它描述了发生什么事情 事件源(Event source)产生事件的组件事件处理方法(Event handler)能够接收、解析和处理事件类对象、实现和用户交互的方法,用户鼠标点击,actionPerformed(ActionEvent e),ActionEvent,4,事件处理模型(Delegation Model),一个事件可以被发送到多个不同的处理方法.,如果关注某个组件产生的事件,则可以在该组件上注册适当的事件处理方法,实际上注册的事件处理者方法所属类型的一个对象-事件监听器,用户鼠标点击,actionPerformed(ActionEvent e)/事件处理方法2,ActionEvent,actionPerformed(ActionEvent e)/事件处理方法1,5,Java事件处理举例(1),import java.awt.*;import java.awt.event.*;public class TestActionEvent public static void main(String args)Frame f=new Frame(Test);Button b=new Button(Press Me!);Monitor bh=new Monitor();b.addActionListener(bh);/注册监听器 f.add(b,BorderLayout.CENTER);f.pack();f.setVisible(true);class Monitor implements ActionListener public void actionPerformed(ActionEvent e)System.out.println(a button has been pressed);,6,事件代理模型综述,Java GUI设计中,通过注册监听器的方式对所关注的事件源进行监控。注册监听器时应指明该监听器监控(感兴趣)的事件种类。当事件源发生了某种类型的事件时,只触发事先已就该种事件类型注册过的监听器。,7,Java事件分类,8,Java GUI事件及相应监听器接口(1),9,Java GUI事件及相应监听器接口(2),10,多重监听器,一般情况下,事件源可以产生多种不同类型的事件,因而可以注册(触发)多种不同类型的监听器。一个事件源组件上可以注册多个监听器,针对同一个事件源的同一种事件也可以注册多个监听器,一个监听器可以被注册到多个不同的事件源上。,11,Java事件处理举例(2),import java.awt.*;import java.awt.event.*;public class TestActionEvent2 public static void main(String args)Frame f=new Frame(Test);Button b1=new Button(Start);Button b2=new Button(Stop);Monitor bh2=new Monitor2();b1.addActionListener(bh);b2.addActionListener(bh);b2.setActionCommand(game over);f.add(b1,North);f.add(b2,Center);f.pack();f.setVisible(true);class Monitor2 implements ActionListener public void actionPerformed(ActionEvent e)System.out.println(a button has been pressed,the relative info is:+e.getActionCommand();,12,多重监听器举例(1),import java.awt.*;import java.awt.event.*;public class TestMultiListener implements MouseMotionListener,MouseListener Frame f=new Frame(多重监听器测试);TextField tf=new TextField(30);public TestMultiListener()f.add(new Label(请按下鼠标左键并拖动),North);f.add(tf,South);f.setBackground(new Color(120,175,175);f.addMouseMotionListener(this);f.addMouseListener(this);f.setSize(300,200);f.setVisible(true);public static void main(String args)TestMultiListener t=new TestMultiListener();/未完,接下页,13,多重监听器举例(2),public void mouseDragged(MouseEvent e)String s=鼠标拖动到位置(+e.getX()+,+e.getY()+);tf.setText(s);public void mouseEntered(MouseEvent e)String s=鼠标已进入窗体;tf.setText(s);public void mouseExited(MouseEvent e)String s=鼠标已移出窗体;tf.setText(s);/未使用的MouseMotionListener和MouseListener接口中的方法,也必须实现 public void mouseMoved(MouseEvent e)public void mousePressed(MouseEvent e)public void mouseClicked(MouseEvent e)public void mouseReleased(MouseEvent e),14,Ex1,练习M11-5/6页中的例子,并对实现了ActionListener接口的 Monitor类进行个性化修改,理解Java语言中的事件处理机制;分析并运行M11-12/13页TestMultiListener.java例子,体会在同一个组件上注册多个事件监听器的机制;扩充TestMultiListener.java,对MouseListener接口和MouseMotionListener接口中其余几个未真正实现的声明的方法进行细化,使其实现一定的功能;,15,事件适配器(Event Adapter),为简化编程,针对大多数事件监听器接口定义了相应的实现类-事件适配器类,在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情。在定义监听器类时就可以继承事件适配器类,并只重写所需要的方法。,ComponentAdapter(组件适配器)ContainerAdapter(容器适配器)FocusAdapter(焦点适配器)KeyAdapter(键盘适配器)MouseAdapter(鼠标适配器)MouseMotionAdapter(鼠标运动适配器)WindowAdapter(窗口适配器),16,事件适配器类举例,java.awt.event.MouseAdapter Implemented Interfaces:EventListener,MouseListener mousePressed(MouseEvent e)mouseReleased(MouseEvent e)mouseEntered(MouseEvent e)mouseExited(MouseEvent e)mouseClicked(MouseEvent e),17,事件适配器用法举例,定义一个监听器类,用于处理鼠标点击事件:1 import java.awt.*;2 import java.awt.event.*;34 public class Monitor3 extends MouseAdapter 56/当只需要处理mouseClick事件时,可以继承7/事件适配器类MouseAdapter,以避免实现接口8/时不得不重写接口中定义的所有方法910 public void mouseClicked(MouseEvent e)11/处理代码12 13,18,内部类在事件处理中的使用(1),import java.awt.event.*;public class TestInner Frame f=new Frame(内部类测试);TextField tf=new TextField(30);public TestInner()f.add(new Label(请按下鼠标左键并拖动),North);f.add(tf,South);f.setBackground(new Color(120,175,175);InnerMonitor im=new InnerMonitor();f.addMouseMotionListener(im);f.addMouseListener(im);f.setSize(300,200);f.setVisible(true);public static void main(String args)TestMultiListener t=new TestMultiListener();/未完,接下页,19,内部类在事件处理中的使用(2),class InnerMonitor implements MouseMotionListener,MouseListener public void mouseDragged(MouseEvent e)String s=鼠标位置(+e.getX()+,+e.getY()+);tf.setText(s);public void mouseEntered(MouseEvent e)String s=鼠标已进入窗体;tf.setText(s);public void mouseExited(MouseEvent e)String s=鼠标已移出窗体;tf.setText(s);public void mouseMoved(MouseEvent e)public void mousePressed(MouseEvent e)public void mouseClicked(MouseEvent e)public void mouseReleased(MouseEvent e)/end of inner class InnerMonitor/end of class TestInner,20,Ex2,在理解的基础上,将M11-18例子中的内部类InnerMoniter改为普通的外部类,实现同样的功能。,