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]
 
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
}

 
 
 








猜你喜欢

转载自www.cnblogs.com/xuxaut-558/p/10045726.html