1 / 40

北京大学计算机系 代亚非

北京大学计算机系 代亚非. 第三章 事件处理. 第 3 章 事件处理. 3.1 什么是事件 3.2 鼠标产生的事件 3.3 键盘产生的事件 3.4 动作事件 3.5 通用事件处理程序 3.6 发送自己的事件 3.7 Java 1.1 事件处理模型 3.9 小结. 外部程序 C 程序 数据库程序. form. cgi. www 浏览器. Web server. url. interact. applet. 3.1 什么是事件. CGI 之外的选择. 什么是事件 ? 用户用于交互而产生的键盘或

inara
Télécharger la présentation

北京大学计算机系 代亚非

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 北京大学计算机系 代亚非 第三章 事件处理

  2. 第3章 事件处理 • 3.1 什么是事件 • 3.2 鼠标产生的事件 • 3.3 键盘产生的事件 • 3.4 动作事件 • 3.5 通用事件处理程序 • 3.6 发送自己的事件 • 3.7 Java 1.1事件处理模型 • 3.9 小结

  3. 外部程序 C程序 数据库程序 form cgi www浏览器 Web server url interact applet 3.1 什么是事件 • CGI之外的选择 • 什么是事件? 用户用于交互而产生的键盘或 • 鼠标动作. • 响应用户的动作称为处理事件. • 在类Event中,定义了所有的事件处理方法, • 小应用已经继承了这些方法.

  4. 3.1 什么是事件 • import java.awt.Event; • Event在java.awt包中,无论哪个键按下或者释放,还是鼠标移动,按下鼠标或释放鼠标,AWT都会捕获,并产生一个事件. • 处理事件的核心是重写处理事件的方法 • 通用方法: • handEvent(Event evt, Object arg) • 专用方法: • MouseDown(Event evt, Object arg)

  5. int clickCount int key int id int modifiers Object target Event Object arg int x int y long when 3.1 什么是事件 • Event类的数据域

  6. MouseUp() MouseDown() Event MouseDrag() MouseMove() HandleEvent() MouseEnter() MouseExit() action() keyDown() KeyUp() 3.1 什么是事件 如果你不覆盖你要处理的方法,则缺省的方法返回一个假值,通知系统没有处理事件 。

  7. 3.2鼠标产生的事件 • 鼠标事件的三个参数: • 1.事件的类型(是移动?托拽) • 2.是按下还是放开? • 3.鼠标的位置(x,y) • 方法的重写: • public boolean mouseDown(Event evt,int x,int y) • {….}

  8. 捕获事件 mouseDown 获得参数(x,y) (Event evt, int x, int y) 在(x,y)处画叉 paint() drawLine 3.2鼠标产生的事件 • 例:在鼠标单击的地方显示“ ”.(MouseClick.html) • 思路:记忆鼠标点过的所有点 • 1.Point marks[]=newPoint[20];(在init方法中) • 2.marks[i++]=new Point(x,y); (MouseDown方法中) • 3.将所有的点画出来(在paint方法中) • g.fillOval(x,y,10,10);

  9. import java.awt.*;import java.applet.*; public class mark extends Applet { int i; Point Marks[]; 3.2鼠标产生的事件 . public void init() {Marks[] =new Point[20]; i=20;} boolean mouseDown(Event evt, int x, int y) { Marks[i++]=new Point(x,y); repaint(); } public void paint(Graphics g) { int k; for (k=0;k<i;k++){ g.fillOval(Marks[k].x,Marks[k].y,10,10); }

  10. 3.2鼠标产生的事件 • [练习]对鼠标的点击动作计数 import java.awt.*;import java.applet.Applet; public class CountClick extends Applet {int CurrentMarks=0; public boolean mouseDown(Event evt,int x,int y) { CurrentMarks++; repaint(); return true; } public void paint(Graphics g) { g.drawString(" "+CurrentMarks,10,10);} }

  11. 3.3键盘产生的事件 捕获的方法 keyDown(Event evt, int key) Event类的键常量 常量 键 常量 键 常量 键 DOWN 下箭头键 END End键 F1 F1键 F2 F2键 F3 F3键 F4 F4键 F5 F5键 F6 F6键 F7 F7键 F8 F8键 F9 F9键 F10 F10键 F11 F11键 F12 F12键 HOME Home键 LEFT 左箭头键PGDN PageDown键PGUP PageUp键 RIGHT右箭头键UP 上箭头键

  12. 3.3键盘产生的事件 • 例题:显示用户按下的字母键内容 • import java.applet.Applet;import java.awt.*; • { char Presskey; • public boolean keyDown(Event evt, int key) • { Presskey=(char)key; • repaint(); return true; • } • public void paint(Graphics g) • { g.drawString(Presskey,10,10); } • }

  13. 3.3键盘产生的事件 • 键盘事件处理通常包括:显示字符,光标移动 • 特殊键 public boolean keyDown(Event evt, int key) { switch(key) { case Event.F1: {….}; case Event.PGUP: {…} } } • 修正键 if(evt.shiftDown()) if(evt.controlDown());

  14. 3.3 键盘产生的事件 • 练习题:在屏幕上显示用户输入的字符串 • 在前一题的基础上,将字符串起来,但是不能用: • String s; s=s+presskey; • 应该用StringBuffer对象的append方法 • StringBuffer sb; • sb.appned(presskey); • sb的内容不能直接用g.drawString() • 应该用g.drawString(sb.toString(),x,y);

  15. 确定 music sports 取消 art 3.4 动作事件 • 凡是由构件产生的事件叫动作事件ACTION_EVENT,处理这类事件的方法是: action().

  16. int clickCount int key int id int modifiers Object target Event Object arg int x int y long when 3.4 动作事件 • action(Event evt, Object arg) • evt.target:指明事件类型 • (button,checkbox,list,...)

  17. 3.4 动作事件 • 判断组件类型(如是button或checkbox) • if(evt.target instanceof Button) • if(evt.target instanceof Checkbox) • 判断是哪多个同类组件中的哪一个 • if(evt.target==button1) • if(evt.target=button2) • 或者通过判断标签内容 • if(arg==“确定”) • if(arg==“取消”)

  18. 10 按钮 3.4 动作事件 例: 记录按下按钮的次数,并显示出来. import java.awt.*; import java.applet.Applet; public class CountClick extends Applet { int CurrentMarks=0; public init() { Button b1=new Button(“按钮”); add.b1; } public boolean action(Event evt,Object arg) { CurrentMarks++; repaint(); return true; } public void paint(Graphics g) { g.drawString(" "+CurrentMarks,10,10);} }

  19. 方 3.4 动作事件 • 例:根据用户选择画图形 • 思路: • 1.设计两个按钮(后面详细讲) • 2.事件处理action • 根据选择,分别标记园或方 • 3 根据标记画出相应图形 • g.drawCirlce(50,50,50,50); • g.drawRect(25,25,75,75); import java.awt.*; import java.applet.Applet; public class drawing extends Applet { boolean circlemark=true; public init() { Button b1=new Button(“园”); Button b2=new Button(“方”); add.b1; add.b2; }

  20. 3.4 动作事件 • public void paint(Graphics g) • { if (circlemark) • g.filloval(10,10,30,30); • else • g.fillRect(20,20,40,40}; • } • public boolean action(Event evt,Object arg) • { if (evt.target==b1) circlrmark=true; • else circlrmark=false; • repaint(); return true; }

  21. 3.5 通用的事件处理程序-----handleEvent • handleEvent处理所有的小应用程序所接受的事件,由它将事件送给相对应的方法. • 让我们看一下handleEvent的缺省实现 public boolean handleEvent(Event evt) { switch(evt) { case Event.MOUSE_ENTER: return mouseEnter(evt,evt.x,evt.y); case Event.MOUSE_EXIT: return mouseExit(evt,evt.x,evt.y); case Event.MOUSE_MOVE: return mouseMove(evt,evt.x,evt.y);

  22. 3.5 通用的事件处理程序-----handleEvent case Event.MOUSE_DRAG: return mouseDrag(evt,evt.x,evt.y); case Event.MOUSE_UP: return mouseUp(evt,evt.x,evt.y); case Event.MOUSE_DOWN: return mouseDown(evt,evt.x,evt.y); case Event.KEY_PRESS: case Event.KEY_ACTION: return keyDown(evt,evt.key); case Event.KEY_RELEASE:

  23. 3.5 通用的事件处理程序---handleEvent case Event.KEY_ACTION_RELEASE: return keyUp(evt,evt.key); case Event.ACTION_EVENT: return action(evt,evt.arg); case Event.GOT_FOCUS: return gotFocus(evt,evt.arg); case Event.LOST_FOCUS: return lostFocus(evt,evt.arg); } return false; }

  24. 3.5 通用的事件处理程序---handleEvent • 覆盖handleEvent的情况(原来的handleEvent不被执行):只处理我们感兴趣的事: public boolean handleEvent(Event evt) { switch(evt.id) { case Event.MOUSE_ENTER: //doing something; case Event.MOUSE_EXIT: //doing something; }} default:return super.handelEvent(evt); return false;

  25. . 3.7 Java1.1 事件模型 • Java 1.0 的事件管理机制 • 在Java1.0中,多数事件发生在类component里,并通过handleEvent()方法将事件传递给相应的处理方法,如果没有这样的方法,则沿着包含层次传给上一级容器,直到最顶层容器仍没有处理,则合理遗弃,不适于重用. 例如一个发生在按钮上的事件,处理它的action方法通常属于包含按钮的父类容器,这不符合面向对象的设计原则 • Java 1.1 的事件管理机制 • 在Java 1.1中,一个事件常常被其它对象处理,这些对象称为事件监听器,当特定事件发生时,相应的监听器能够知道。AWT共有11个监听器类,每个都有处理事件的方法。

  26. 3.7 Java1.1 事件模型 • 在 Java 1.1 中如何捕获事件? • 三个步骤: • 1. 必须定义一个类来实现接口 • class ButtonTracker implements ActionListener{…} • 2. 定义方法 • 3. 向构件注册该类的一个实例 • button1.addActionListener(this); • checkbox.addActionListener(this);

  27. 3.7 Java1.1 事件模型 • Java1.0和Java1.1事件模型的区别? • 在Java1.1中,事件不再沿着包含层次向上传递,而是传给一个监听器,因此在Java1.1中,你希望发生在构件事件由哪个监听器处理,就将该监听器注册到构件上.

  28. 窗口或面板的监听器 窗口 panel 按钮的监听器 button 3.7 Java1.1 事件模型

  29. 3.7 Java1.1 事件模型 • 常用的监听器及其方法 • 键盘监听器 :KeyListener,方法: • keyPressed, KeyReleased, keyTyped. • 鼠标监听器 : MouseListener, 方法: • mouseClicked, mousePressed, mouseReleased, • mouseEntered, mouseExited • 构件监听器 :ActionListener, 方法: • actionPerformed(); • 如果一个监听器有若干各方法,则必须将这些方法全部覆盖

  30. 3.7 Java1.1 事件模型 • 例: • import java.awt.event.*;import java.awt.*; • import java.applet.*; • public class TestButton extends Applet • { Button button1; • Color color; • }

  31. 3.7 Java1.1 事件模型 public void init() { button1 = new Button("Test Button"); button1.addActionListener (new ButtonHandler(this)); add(button1); Font font = new Font("TimesRoman", Font.PLAIN, 48); g.setFont(font); color = Color.black; resize(400, 200); }

  32. 3.7 Java1.1 事件模型 public void paint(Graphics g) { g.setColor(color); g.drawString("TEST COLOR", 55, 120); }

  33. 3.7 Java1.1 事件模型 public class ButtonHandler implements ActionListener { TestButton a; ButtonHandler(TestButton tb) { a=ts;} public void actionPerformed(ActionEvent event) { String arg = event.getActionCommand(); if (arg == "Test Button") { if (a.color == Color.black) a.color = Color.red; else a.color = Color.black; a.repaint(); } }

  34. 3.7 Java1.1 事件模型 class TestButton color=black; paint() 100101 button class ButtonHandler a a.color=black; new ButtonHandler(this); 100101

  35. 3.7 Java1.1 事件模型 public class TestButtoninner extends Applet { Button button1; Color color; Font font; class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent event) { String arg = event.getActionCommand(); if (arg == "Test Button") { if (color == Color.black) color = Color.red; else color = Color.black; repaint(); } } }

  36. 3.7 Java1.1 事件模型 class Example {public void init() { Button button1=new Button(“button”); button1.addActionListener(new ButtonHandler() { public void actionPerformed(ActionEvent event) { String arg = event.getActionCommand(); if (arg == "Test Button") { if (color == Color.black) color = Color.red; else color = Color.black; repaint(); } }; • 在某个类的内部定义的类叫内部类 • 内部类的特点: • 内部类可以访问外部类的数据和方法 • 内部类的匿名形式是指: • 在定义一个新类的同时创建一个实例. .

  37. 3.7 Java1.1 事件模型 • 适配器 • 简化代码 • 不用适配器时,必须对某个适配器的多个方法进行重写,加入适配器后可以为这些方法提空实现 class MouseAdapter implements MousListener { public void mouseClicked(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} }

  38. 3.7 Java1.1 事件模型 • 继承某个适配器的子类,则程序中只需覆盖你需要的方法,其余方法则从父类继承 • class MouseTrack extends MouseAdapter • { public void mouseClicked(MouseEvent e) • { //…handle mouse click event; • } • }

  39. 3.8小结 • 事件由用户的使用了鼠标和键盘动作引起的 • 事件由事件处理器来处理 • handleEvent()方法是Applet从component继承而来的. • 重写handleEvent()方法时注意返回false指明有些情况被忽略,将其传给上层对象. • 在组件上产生的动作叫动作事件,action方法类处理

  40. 3.10作业 • 1. 在鼠标按下的两点之间画一条线

More Related