`

Java 事件模型基础:监听器、事件、事件源、事件注册

阅读更多
转自
http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html
http://www.tuicool.com/articles/FrAF3m

鼠标监听器MouseListener
监听鼠标事件MouseEvent。

相应事件和处理方法
鼠标事件         处理方法
MOUSE_CLICKED    MouseClicked (MouseEvent)    鼠标点击(单或双)
MOUSE_PRESSED    MousePressed (MouseEvent)    鼠标按下
MOUSE_RELEASED   MouseReleased(MouseEvent)    鼠标松开
MOUSE_ENTERED    MouseEntered (MouseEvent)    鼠标进入(某组件区域)
MOUSE_EXITED     MouseExited  (MouseEvent)    鼠标离开(某组件区域)
鼠标事件MouseEvent常用方法
int getClickCount()      得到点击次数1 OR 2;
int getX(), int getY()   得到鼠标的(象素)位置。

鼠标监听器MouseMotionListener
对于鼠标的移动和拖放,另外用鼠标运动监听器MouseMotionListener。
因为许多程序不需要监听鼠标运动,把两者分开可简化程序。
相应事件和处理方法
鼠标事件          处理方法
MOUSE_MOVED      MouseMoved  (MouseEvent)    鼠标在移动
MOUSE_DRAGGED    MouseDragged(MouseEvent)    鼠标被拖动

范例Java程序
我们把对这两个鼠标监听器综合运用。
package com.test0803;  
  
import java.awt.Color;  
import java.awt.Frame;  
import java.awt.Label;  
import java.awt.TextField;  
import java.awt.event.MouseEvent;  
import java.awt.event.MouseListener;  
import java.awt.event.MouseMotionListener;  
import java.awt.event.WindowAdapter;  
import java.awt.event.WindowEvent;  
  
public class Test_Mouse2  implements MouseMotionListener,MouseListener{  
    Frame frame = new Frame("关于鼠标的多重监听器");  
    TextField tField = new TextField(30);  
    public Test_Mouse2(){  
        Label label = new Label("请按下鼠标左键并拖动");  
        frame.add(label, "North");  
        frame.add(tField, "South");  
        frame.setBackground(new Color(180, 255, 255));  
        frame.addMouseListener(this);  
        frame.addMouseMotionListener(this);  
        frame.addWindowListener(new WindowAdapter() {  
            @Override  
            public void windowClosing(WindowEvent e) {  
                // TODO Auto-generated method stub  
                System.exit(0);  
            }  
        });  
        frame.setSize(300, 200);  
        frame.setLocation(400, 250);  
        frame.setVisible(true);  
    }  
    public static void main(String[] args) {  
        new Test_Mouse2();  
    }  
  
    @Override  
    public void mouseClicked(MouseEvent e) {  
        // TODO Auto-generated method stub  
        System.out.print("鼠标点击----" + "\t");  
        if (e.getClickCount()==1) {  
            System.out.println("单击!");  
        } else if (e.getClickCount()==2) {  
            System.out.println("双击!");  
        } else if (e.getClickCount()==3) {  
            System.out.println("三连击!!");  
        }  
          
    }  
  
    @Override  
    public void mousePressed(MouseEvent e) {  
        // TODO Auto-generated method stub  
        System.out.println("鼠标按下");  
    }  
  
    @Override  
    public void mouseReleased(MouseEvent e) {  
        // TODO Auto-generated method stub  
        System.out.println("鼠标松开");  
    }  
  
    @Override  
    public void mouseEntered(MouseEvent e) {  
        // TODO Auto-generated method stub  
        tField.setText("鼠标已经进入窗体");  
    }  
  
    @Override  
    public void mouseExited(MouseEvent e) {  
        // TODO Auto-generated method stub  
        tField.setText("鼠标已经移出窗体");  
    }  
  
    @Override  
    public void mouseDragged(MouseEvent e) {  
        // TODO Auto-generated method stub  
        String string = "鼠标拖动到位置:(" + e.getX() + "," + e.getY() +")";  
        tField.setText(string);  
    }  
  
    @Override  
    public void mouseMoved(MouseEvent e) {  
        // TODO Auto-generated method stub  
    }  
  
}  



事件模型相关概念
  事件:描述发生了什么的对象。
  存在各种不同类型的事件类用来描述各种类型的用户交互。

  事件源:事件的产生器。

  事件处理器:接收事件、解释事件并处理用户交互的方法。


  比如在Button组件上点击鼠标会产生以这个Button为源的一个ActionEvent,这个ActionEvent实例是一个对象,它包含关于刚才发生的那个事件的信息,这些信息包括:

  getActionCommand():返回与动作相关联的命令名称。
  getWhen():返回事件发生的时间。

  如果用户在用户界面层执行了一个动作(鼠标点击和按键),这将导致一个事件的发生。


AWT事件模型
  JDK1.0的事件模型:层次模型。(已废弃)

  JDK1.1或更高的事件模型:委托模型。

  事件监听器:实现了监听器接口的类。一个监听器对象是一个实现了专门的监听器接口的类的实例。

  下面是一个简单的代码例子,说明按钮事件的监听处理。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestButton
{
    public static void main(String[] args)
    {
        Frame frame = new Frame("Test Button");
        Button button = new Button("Press Me!");

        // 增加事件处理器
        button.addActionListener(new ButtonHandler());

        // 将按钮加入frame
        frame.add(button, BorderLayout.CENTER);

        frame.pack();

        frame.setVisible(true);
    }

}

class ButtonHandler implements ActionListener
{

    @Override
    public void actionPerformed(ActionEvent e)
    {
        //事件处理器

        System.out.println("Button is pressed!");
        
        String label = e.getActionCommand();
        System.out.println(label);
    }
}


  当单击一个按钮时,就会产生一个事件(ActionEvent),然后检查是否有与该按钮关联的事件处理器(实际上是一个方法),

  如果没有,那么什么都不执行;

  如果有的话,就会将该事件传递给与该按钮关联的事件处理器方法,作为该方法的参数,之后该事件处理方法就会自动得到调用,并且该方法可以使用传递过来的ActionEvent对象,进而获得事件发生时与该事件及事件源相关联的那些信息。

  Java中的组件若想添加事件处理器,都会使用形如addXxxListener()的方法来添加。一个事件源可以添加多个监听器。


委托模型的优点
  事件不会被意外地处理。

  有可能创建并使用适配器(adapter)类对事件动作进行分类。

  委托模型有利于把工作分布到各个类中。


几类具有典型代表意义的事件
  MouseEvent,鼠标事件,鼠标按下、释放、点击等。

  WindowEvent,窗口事件,点击关闭按钮,窗口得到与失去焦点,窗口最小化等。

  ActionEvent,动作事件,不代表具体的动作,是一种语义。如按钮或菜单被鼠标单击,单行文本框中按下回车键等都可以看做是ActionEvent事件。

  如果用户的一个动作导致了某个组件最基本的动作发生了,这就是ActionEvent事件。

  对于每类事件,都会有一个接口(接口一般叫XxxListener),这个接口要求定义一个或多个方法。想接收这个事件的类必须实现这个接口,当发生这些事件时,就会调用这些方法。

  关于事件处理的另一个例子:  

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.sql.Date;

public class MyWindow implements MouseListener, MouseMotionListener
{
    private Frame frame;
    private Label label;
    private Button button;
    private TextField textField;

    public void go()
    {
        frame = new Frame("My Frame");
        // 加上窗口监听器,其中主要实现了退出功能
        frame.addWindowListener(new MyWindowListener());

        // 加一个标签
        label = new Label("This is my Window");
        frame.add(label, BorderLayout.NORTH);

        // 加一个按钮
        button = new Button("MyButton");
        frame.add(button, BorderLayout.WEST);

        // 设置按钮事件监听器,按钮按下时会向控制台输出信息
        button.addActionListener(new MyButtonListener());

        // 加一个文本编辑框
        textField = new TextField(40);
        frame.add(textField, BorderLayout.SOUTH);

        // 加上鼠标动作监听器,因为类本身实现了这两个接口,所以参数是this
        frame.addMouseListener(this);
        frame.addMouseMotionListener(this);
        // 可以添加多个监听器,所以还可以定义其他的,如MyMouseListener类,然后加上

        // 设置刚好能容纳这些控件的尺寸
        frame.pack();
        // 设置为可见
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        MyWindow window = new MyWindow();

        window.go();
    }

    @Override
    public void mouseDragged(MouseEvent e)
    {

    }

    @Override
    public void mouseMoved(MouseEvent e)
    {
        String str = "x = " + e.getX() + ", y = " + e.getY();
        this.textField.setText(str);
        System.out.println(str);
    }

    @Override
    public void mouseClicked(MouseEvent e)
    {

    }

    @Override
    public void mouseEntered(MouseEvent e)
    {

    }

    @Override
    public void mouseExited(MouseEvent e)
    {
        this.textField.setText("the mouse has exited.");
    }

    @Override
    public void mousePressed(MouseEvent e)
    {

    }

    @Override
    public void mouseReleased(MouseEvent e)
    {

    }

}

class MyButtonListener implements ActionListener
{

    @SuppressWarnings("deprecation")
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // 输出信息
        System.out.println("The Button is pressed!");

        // 输出时间戳
        Long time = e.getWhen();
        System.out.println("timestamp: " + time);

        // 日期时间
        Date date = new Date(time);
        System.out.println(date.toLocaleString());

    }

}

class MyWindowListener implements WindowListener
{

    @Override
    public void windowActivated(WindowEvent e)
    {

    }

    @Override
    public void windowClosed(WindowEvent e)
    {

    }

    @Override
    public void windowClosing(WindowEvent e)
    {
        System.out.println("windowClosing");
        // 退出
        System.exit(0);
    }

    @Override
    public void windowDeactivated(WindowEvent e)
    {

    }

    @Override
    public void windowDeiconified(WindowEvent e)
    {

    }

    @Override
    public void windowIconified(WindowEvent e)
    {

    }

    @Override
    public void windowOpened(WindowEvent e)
    {

    }
}



参考资料
  张龙老师Java SE视频教程。

  本博客相关文章:

  http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html
分享到:
评论

相关推荐

    Java核心技术卷1:基础知识(第9版)(中文版)

    第8版针对Java SE 6平台进行了全面更新,囊括了Java 2平台、标准版(J2SE)的全部基础知识,提供了大量完整且具有实际意义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口与内部类、事件监听器模型、...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    Java开发技术大全(500个源代码).

    示例描述:本章介绍开发Java的基础语法知识。 accumulationByDoWhile.java 用do~while语句写的累加程序 accumulationByFor.java 用for语句写的累加程序 accumulationByWhile.java 用while语句写的累加程序 ...

    Java核心技术 第12版 开发基础+高级特性 英文原版

    着力让读者在充分理解Java语言和Java类库的基础上,灵活应用Java提供的高级特性,具体包括面向对象程序设计、反射与代理、接口与内部类、异常处理、泛型程序设计、集合框架、事件监听器模型、图形用户界面设计和并发...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA基础课程讲义

    目 录 第一章 JAVA入门 10 计算机语言发展史 10 机器语言 10 汇编语言 10 高级语言 10 其他高级语言 11 ...事件监听器常见的定义形式 233 AWT其他组件 233 菜单的实现 233 特点 233 代码示例和效果 233

    Java核心技术基础(第8版)中文带标签-part1(共2部分)

    囊括了Java平台标准版(JavaSE/J2SE)的全部基础知识,提供了大量完整且具有实际意义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    JAVA 2 核心技术 卷II:高级特性7th-1

    本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java 2开发平台标准版J2SE 5.0的基础知识,主要内容包括面向对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing ...

    EventCenter:EventCenter 事件中心,用于分布式系统中广播发布事件, 目前只有activemq 实现

    广播式事件的监听器只有注册后,才会收到注册前的所有未被消费的历史事件。(单次式事件注册时就可以读取历史事件) 单次式事件(持久化事件) 一个事件只能被 一个监听器 或者 多个监听同一事件并且逻辑相同的监听器组 ...

    Java2核心技术卷I:基础知识(Part8,共8)

    本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI...

    Java2核心技术卷I:基础知识(Part2,共8)

    本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI...

    Java2核心技术卷I:基础知识(Part4,共8)

    本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI...

    Java2核心技术卷I:基础知识(Part7,共8)

    本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI...

    Java2核心技术卷I:基础知识(Part5,共8)

    本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI...

    Java2核心技术卷I:基础知识(Part6,共8)

    本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI...

Global site tag (gtag.js) - Google Analytics