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

转自
[url]http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html[/url]
[url]http://www.tuicool.com/articles/FrAF3m[/url]

鼠标监听器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
}

}



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

  [b]事件源:[/b]事件的产生器。

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


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

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

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


[b]AWT事件模型[/b]
  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()的方法来添加。一个事件源可以添加多个监听器。


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

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

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


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

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

  [b]ActionEvent[/b],动作事件,不代表具体的动作,是一种语义。如按钮或菜单被鼠标单击,单行文本框中按下回车键等都可以看做是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)
{

}
}



[b]参考资料[/b]
  张龙老师Java SE视频教程。

  本博客相关文章:

  http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值