JAVA入门到精通-第36讲-事件监听-坦克大战4



Java事件处理机制: 

事件源;事件;事件监听者;事件处理方法;



 任何一个类,只要实现了相应的接口,就可以去监听某个事件源;

一个类要实现监听的基本步骤:



 a.实现相应的接口[KeyListener,MouseListener,ActionListener,WindowListener]

b.把接口的处理方法根据需要重新编写(override)

c.在事件源注册监听

d.事件传递是靠事件对象

通过ActionEvent传递事件;

通过事件进行委派事件模型进行事件处理;



 一个事件源可能会生成多个不同类型的事件:

绘图的时候有Panel,Panel上有按钮;

JPanel上鼠标可以点击,移动,也是一种事件;



 JAVA处理机制的内部实现;



 根据需要选择监听接口;

一个类可以实现一个监听接口,也可以实现多个监听接口;



 Panel绘图;



鼠标移动接口:MouseListener 

拿到鼠标的位置:



 getX    getY

键盘监听:KeyListener

Press 和 Type有什么区别 :F1键 对于TYPE是不会触发的;

鼠标移动和拖拽的事件的监听:

MouseMotionListener:



 



 this.addMouseMotionListener(mp);

窗口的关闭,最大化,最小化事件监听:

WindowEventListener



 事件源、事件监听、事件注册都是分类的;

-----------------------------------------------------------------------

java事件处理机制--深入理解

前面提到了几个重要的概念

1、事件源;2、事件;3、事件监听器

这几个概念非常重要,必需要搞清楚。

1、事件源

事件源是一个产生(或触发)事件的对象,比如前面的JButton的一个对象jb1。当这个事件源对象的某些状态以某种方式发生变化时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)。如果某个组件(对象)希望得到事件源产生的事件,就需要在这个事件源上注册。

2、事件

事件就是承载事件源状态改变时的信息对象。或者说,事件是事件源事件监听器传输事件源状态信息的载体。在用户与GUI组件进行交互时就会生成事件,比如当鼠标在面板中移动时,就会生成一个鼠标移动事件的对象,而这个对象保存着当前鼠标在面板中位置信息。java.awt.event包和javax.swing.event包中定义了各种事件类型,常见的事件类有:

事件类                                           说明

ActionEvent              通常在按下按钮,或双击一个列表项或选中某个菜单时发生

AdjustmentEvnet      当操作一个滚动条时发生

ComponentEvent      当一个组件隐藏、移动、改变大小时发送

ContainerEvent          当一个组件从容器中加入或者删除时发生

FocusEvent                 当一个组件获得或是失去焦点时发生

ItemEvent                      当一个复选框或是列表项被选中时,当一个选择框或选择菜单被选中

KeyEvent                      当从键盘的按键被按下,松开时发生

MouseEvent                当鼠标被拖动、移动、点击、按下..

TextEvent                      当文本区和文本域的文本发生改变时发生

WindowEvent               当一个窗口激活、关闭、失效、恢复、最小化...

3、事件监听器接口

事件源产生一个事件,可以传送给事件监听者处理,那么怎样才能编写一个事件监听者呢?

事件监听者实际上就是一个类,该类实现了某个事件监听器接口、比如前面我们案例中的MyPanel就是一个类,它实现了ActionListener接口,它就可以作为一个事件监听者,对接受到的事件进行处理。

事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现一个事件监听接口,也可以实现多个监听接口,这些接口在java.awt.event和javax.swing.event包中定义。


java事件处理机制--总结

总结--事件编程步骤:

1、编写事件处理类(事件监听者)

2、根据需求给事件处理类实现监听器接口

3、在事件处理中重写(实现)其事件处理的函数

4、在事件源类中指定该事件的监听器(响应者)是谁

注意事项:

1、java采用委托机制处理事件

2、java中的事件是分类的,比如对窗体事件、鼠标事件、按键事件、操作事件[按按钮]

3、java中一个类要监听某个事件,则必需实现相应的事件监听接口

4、事件监听接口有多种,程序员应当针对不同的情况,实现不同的监听接口,比如监听鼠标事件就应当实现MouseListener;要监听键盘事件,就应当实现KeyListener..

5、在实现监听接口的类(事件监听类/者)中,需要重写处理函数,比如实现了ActionListener接口,就应当重写actionPerformed(ActionEvent e),可以参考前面的事件监听器接口表格

6、在事件源中需要注册事件监听类。否则事件监听类接收不到事件源发生的事件。

一个类要实现监听的步骤:

a、实现相应的接口[KeyListener/MouseListener/ActionListener/WindowListener]

b、把接口的处理方法根据需要重新编写(Override)

c、在事件源上注册监听

d、事件传递是靠事件(类)对象

实例[Window018.java]

/**
* 单事件源、多事件监听,多事件处理
*/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Window018 extends JFrame{
//设定组件
MyPanel mp=null;
public static void main(String[] args) {
Window018 win=new Window018();
}

public Window018(){
//创建组件
mp=new MyPanel();

//注册监听
this.addMouseListener(mp);
this.addMouseMotionListener(mp);
this.addKeyListener(mp);
this.addWindowListener(mp);

//加入组件
this.add(mp);
//设置窗体
this.setTitle("事件多监听多处理");
this.setSize(400, 300);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//1、让MyPanel知道鼠标按下的消息,并且知道点击的位置(x,y)
//2、让MyPanel知道哪个键按下了

class MyPanel extends JPanel implements MouseListener,MouseMotionListener,KeyListener,WindowListener{
public void paint(Graphics g){
super.paint(g);
}

//鼠标点击(mouseClicked)
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击了x="+e.getX()+"y="+e.getY());
}

//鼠标移动到MyPanel(mouseEntered)
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标移动到MyPanel上了");
}

//鼠标离开MyPanel(mouseExited)
public void mouseExited(MouseEvent e) {
System.out.println("鼠标离开MyPanel上了");
}

//鼠标按下去(mousePressed)
public void mousePressed(MouseEvent e) {
System.out.println("鼠标被按下了");
}

//鼠标松开(mouseReleased)
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标被松开了");
}

//鼠标拖拽(mouseDragged)
public void mouseDragged(MouseEvent e) {
System.out.println("鼠标拖拽x="+e.getX()+"y="+e.getY());
}

//鼠标移动(mouseMoved)
public void mouseMoved(MouseEvent e) {
System.out.println("鼠标移动时X="+e.getX()+"Y="+e.getY());
}

//键输入值(keyTyped),F(1-12)无响应
public void keyTyped(KeyEvent e) {
System.out.println("按下了"+e.getKeyChar()+"键");
}

//键按下(keyPressed)
public void keyPressed(KeyEvent e) {
System.out.println("按下了"+e.getKeyChar()+"键");
}

//键松开(keyReleased)
public void keyReleased(KeyEvent e) {
System.out.println("按下了"+e.getKeyChar()+"键");
}

//打开窗口(windowOpened)
public void windowOpened(WindowEvent e) {
System.out.println("打开窗口(windowOpened)");
}

//窗口关闭(windowClosing)
public void windowClosing(WindowEvent e) {
System.out.println("窗口关闭(windowClosing)");
}

//窗口关闭(windowClosed)
public void windowClosed(WindowEvent e) {
System.out.println("窗口关闭(windowClosed)");
}

//窗口最小化(windowIconified)
public void windowIconified(WindowEvent e) {
System.out.println("窗口最小化(windowIconified)");
}

//恢复窗口(windowDeiconified)
public void windowDeiconified(WindowEvent e) {
System.out.println("恢复窗口(windowDeiconified)");
}

//激活窗口,使用窗口(windowActivated)
public void windowActivated(WindowEvent e) {
System.out.println("激活窗口(windowActivated)");
}

//窗口停用,切换窗口(windowDeactivated)
public void windowDeactivated(WindowEvent e) {
System.out.println("窗口停用(windowDeactivated)");
}
}

1

/**

2

 * 单事件源、多事件监听,多事件处理

3

 */

4

import java.awt.*;

5

import javax.swing.*;

6

import java.awt.event.*;

7

public class Window018 extends JFrame{

8

    //设定组件

9

    MyPanel mp=null;

10

    public static void main(String[] args) {

11

        Window018 win=new Window018();

12

    }

13


14

    public Window018(){

15

        //创建组件

16

        mp=new MyPanel();

17

        

18

        //注册监听

19

        this.addMouseListener(mp);

20

        this.addMouseMotionListener(mp);

21

        this.addKeyListener(mp);

22

        this.addWindowListener(mp);

23

        

24

        //加入组件

25

        this.add(mp);

26

        //设置窗体

27

        this.setTitle("事件多监听多处理");

28

        this.setSize(400, 300);

29

        this.setLocationRelativeTo(null);

30

        this.setVisible(true);

31

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

32

    }

33

}

34

//1、让MyPanel知道鼠标按下的消息,并且知道点击的位置(x,y)

35

//2、让MyPanel知道哪个键按下了

36


37

class MyPanel extends JPanel implements MouseListener,MouseMotionListener,KeyListener,WindowListener{

38

    public void paint(Graphics g){

39

        super.paint(g);

40

    }

41


42

    //鼠标点击(mouseClicked)

43

    public void mouseClicked(MouseEvent e) {

44

        System.out.println("鼠标点击了x="+e.getX()+"y="+e.getY());

45

    }

46


47

    //鼠标移动到MyPanel(mouseEntered)

48

    public void mouseEntered(MouseEvent e) {

49

        System.out.println("鼠标移动到MyPanel上了");

50

    }

51


52

    //鼠标离开MyPanel(mouseExited)

53

    public void mouseExited(MouseEvent e) {

54

        System.out.println("鼠标离开MyPanel上了");

55

    }

56

    

57

    //鼠标按下去(mousePressed)

58

    public void mousePressed(MouseEvent e) {

59

        System.out.println("鼠标被按下了");

60

    }

61


62

    //鼠标松开(mouseReleased)

63

    public void mouseReleased(MouseEvent e) {

64

        System.out.println("鼠标被松开了");

65

    }

66


67

    //鼠标拖拽(mouseDragged)

68

    public void mouseDragged(MouseEvent e) {

69

        System.out.println("鼠标拖拽x="+e.getX()+"y="+e.getY());

70

    }

71


72

    //鼠标移动(mouseMoved)

73

    public void mouseMoved(MouseEvent e) {

74

        System.out.println("鼠标移动时X="+e.getX()+"Y="+e.getY());

75

    }

76


77

    //键输入值(keyTyped),F(1-12)无响应

78

    public void keyTyped(KeyEvent e) {

79

        System.out.println("按下了"+e.getKeyChar()+"键");

80

    }

81


82

    //键按下(keyPressed)

83

    public void keyPressed(KeyEvent e) {

84

        System.out.println("按下了"+e.getKeyChar()+"键");

85

    }

86


87

    //键松开(keyReleased)

88

    public void keyReleased(KeyEvent e) {

89

        System.out.println("按下了"+e.getKeyChar()+"键");

90

    }

91


92

    //打开窗口(windowOpened)

93

    public void windowOpened(WindowEvent e) {

94

        System.out.println("打开窗口(windowOpened)");

95

    }

96


97

    //窗口关闭(windowClosing)

98

    public void windowClosing(WindowEvent e) {

99

        System.out.println("窗口关闭(windowClosing)");

100

    }

101


102

    //窗口关闭(windowClosed)

103

    public void windowClosed(WindowEvent e) {

104

        System.out.println("窗口关闭(windowClosed)");

105

    }

106


107

    //窗口最小化(windowIconified)

108

    public void windowIconified(WindowEvent e) {

109

        System.out.println("窗口最小化(windowIconified)");

110

    }

111


112

    //恢复窗口(windowDeiconified)

113

    public void windowDeiconified(WindowEvent e) {

114

        System.out.println("恢复窗口(windowDeiconified)");

115

    }

116


117

    //激活窗口,使用窗口(windowActivated)

118

    public void windowActivated(WindowEvent e) {

119

        System.out.println("激活窗口(windowActivated)");

120

    }

121


122

    //窗口停用,切换窗口(windowDeactivated)

123

    public void windowDeactivated(WindowEvent e) {

124

        System.out.println("窗口停用(windowDeactivated)");

125

    }

126

}



 

 

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/xuxaut-558/p/10045726.html

时间: 2024-10-12 17:48:44

JAVA入门到精通-第36讲-事件监听-坦克大战4的相关文章

JAVA入门到精通-第94讲-山寨QQ项目8-好友在线提示

遇到的问题: 现在每登录一个人,后面的人是能看到前面的登录的人的: 但是,前面的人看不到后面的人登录: //后面每登录一个人,有责任去通知前面登录的人他已经上线了: 通知了完以后,需要更改好友在线的情况: //不让同一个账号反复登录 //如果 好友不在线,则不能聊天 ================================ [ManageQqChat.java] /** * 这是一个管理用户聊天界面的类 */ package com.qq.client.tools; import jav

JAVA入门到精通-第35讲-事件处理-坦克大战3

画出弧形: g.drawArc: 前两个参数:代表中心点,后面代表宽,高,后面是弧度的大小:  50代表弧度,后面方向:    SWING编程三个部分: (1)组件和布局管理器: (2)绘图技术: (3)事件处理机制:  鼠标,键盘按下的某个按钮或者移动等都是事件: JAVA认为,消息是一种事件对象:事件监听者也是一个类: 事件监听者中有函数或者方法专门去处理事件: import  java.awt.Event.*; 需要对事件进行处理,把Event包带进去:  Border布局中间是 默认的:

JAVA 图形开发之计算器设计(事件监听机制)

/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 [email protected]*/ 前段时间刚帮同学用MFC写了个计算器,现在学到JAVA的图形开发,就试着水了一个计算器出来.(可以说是一个水的不能再水的计算器了,感觉MFC真好用) 既然是设计计算器,首先肯定是要做一个计算器界面出来了,但面对JAVA容器的两种布局,想把按钮放整齐真的是一件比较难的事,我就直接用了坐标法贴图(上篇博客中有介绍).这是我设计的界面 界面设计完了,下面就要开始实现按按钮输入数据.这时就需要使用事件监听

JAVA入门到精通-第33讲-绘图技术.坦克大战1

    用的是Access数据库,安全性不够好,性能也不够强大:   躲在这里,坦克很少过来,做了一个随机数: 把得分的记录保存在数据库里面: SQLServer2005中型数据库:    (x,y)坐标:     800x600:     表示计算机屏幕上的每一行由800个点组成,共有600行:   共有480000个像素:   java绘图技术:   绘图一般在JPane上画: 覆盖JPanel的paintat方法 Graphics是一个图形画笔类,绘图的重要类,可以理解为一只画笔 supe

JAVA入门到精通-第70讲-学生管理系统2-增删改

-完成一个mini版本学生管理系统 jude软件:很好使的,安装一下就可以用了: -学生管理系统的添加 .修改.删除.上下页分页 ---------------------------------------------- 上面是一个流布局,JPanel 下面是一个流布局,JPanel 中间是Border布局,边界布局,CENTER JTextField jtf; 先加JLable--->Jtf文本域->JButton按钮 ------------------------- mis 系统:信息

JAVA入门到精通-第46讲-IO编程.记事本开发

IO编程-记事本开发 fis.read(bytes) 字节数组: 通过fis把文件里面的1800个字符,尽可能的读, 最多读1024个.记录一下,0-1024记录到bytes; 再去读的首,fis.read试图1024个字节,不够了, 第二次读了776个,n=776:(0,776): 第三次,又准备读1024,这次一个读不到,返回-1: 退出循环: JMenuBar 菜单条是一个JMenuBar: JMenu File是一个JMenu; JMenuItem 下面这些选项是JMenuItem; 一

JAVA入门到精通-第31讲-常见组件

面板组件-Jpanel  一个JFrame,多个JPanel: JPanel默认是流布局:FlowLayout:  通过JPanel达到复杂布局的目的:  可以认为是网格布局,有3个JPanel:2个Label:2个按钮: 一个密码框和一个文本输入框:   最终展现出来的还是靠JFrame展现的  网格布局好点,3个JPanel,用流布局,控件往里加: ButtonGroup按钮组:一组里面只能选择一个:    对单选框管理,就是把它加入到ButtonGroup里面: 单选框也是一个个放进JPa

JAVA入门到精通-第45讲-IO编程

image1=ImageIO.read(new File("bomb_1.gif")); 图片拷贝: 输入流和输出流同时要用的问题: 图片读入到内存: 写入,输出到某个文件: 二进制文件,字节流完成: FileInputStream fis=new FileInputStream("xxxx.jpg"); 输出到指定文件:FileOutputStream  fos=null; 关闭打开的文件流: -----------------------------------

JAVA入门到精通-第72讲-学生管理系统4-model 2模式(1)

删除.查询.添加.修改: -修改: 每个字段都可能修改: //给?赋值 //在prepareStatement语句后面赋值才好用 //修改完了,更新数据 目前为止,已经完成了增删改查-Model1模式 最大特点: 界面和业务逻辑操作是放在一起的: 优点:简单,开发方便: 缺点:代码复用性不高: 中大型项目可读性差,可维护性不高: 前台后端混杂在一起的: 比如:"数据库密码换了, 所有涉及到数据库的地方都需要发生变化" =================================