JavaSE第八十讲:监听器、事件、事件源、事件注册深度剖析
2013-01-13 21:08
441 查看
1. AWT事件处理
事件处理机制,几类具有典型代表意义的事件:
图80-1:几种常用事件处理机制
查看JDK Doc文档中的
2. 用户图形界面的行为
1). 事件类型
(1)事件类的层次结构图如下所示。许多事件类在java.awt.event包中,也有一些事件类在API的其他地方
(2) 对于每类事件,都有一个接口,这个接口必须由想接收这个事件的类的对象实现。这个接口还要求定义一个或多个方法。当发生特定的事件时,就会调用这些方法
2).事件类的结构图:不需要记,用的时候学会查看JDK文档即可
图80-2: 事件类结构图
3).方法类型和接口
图80-3:常用事件方法类型和接口
demo程序如下:
编译执行结果产生一个窗口,这里不截图出来了,输出以下内容:
2013-1-13 21:25:39
关闭窗口
3. 下面我们联系以下两个监听器的使用方法:
Demo程序如下所示:
package com.ahueir.awt;
import java.awt.BorderLayout;
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;
public class TwoListen implements MouseListener, MouseMotionListener{
private Frame frame;
private TextField textField; //文本框
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
//当鼠标退出Frame后,在命令行中打印出信息
@Override
public void mouseExited(MouseEvent e) {
String str = "The mouse has left the Frame";
this.textField.setText(str);
}
//鼠标拖动的时候,注意是点击拖动
@Override
public void mouseDragged(MouseEvent e) {
/*
* 对于图形界面来说,窗口的坐上角是起点
*/
String str = "x: " + e.getX() + ", y:" + e.getY();
this.textField.setText(str); //将鼠标拖动获得的信息加到文本框中
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
public void go(){
frame = new Frame("Two Listener Example");
frame.add(new Label("click"), BorderLayout.NORTH); //添加一个 Label:标签
textField = new TextField(30); //表示文本框的长度为30
frame.add(textField, BorderLayout.SOUTH);
frame.addMouseMotionListener(this); //使用this表示直接使用本类中当前的对象
frame.addMouseListener(this);
frame.addMouseListener(new MyMouseListener());
frame.setSize(300, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
TwoListen two = new TwoListen();
two.go();
}
}
class MyMouseListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
String str = "The mouse has entered the Frame";
System.out.println(str);
}
@Override
public void mouseExited(MouseEvent e) {
String str = "The mouse has exited the Frame";
System.out.println(str);
}
}
编译执行结果如图所示:
【说明】:对于同一个事件源,注册两个同种类型的监听器是没有问题的,而且他们同时的都会发生作用。如下图所示:
【说明】:同一个事件源触发三种相同的事件类型,这三个事件处理器都会执行
事件处理机制,几类具有典型代表意义的事件:
图80-1:几种常用事件处理机制
查看JDK Doc文档中的
2. 用户图形界面的行为
1). 事件类型
(1)事件类的层次结构图如下所示。许多事件类在java.awt.event包中,也有一些事件类在API的其他地方
(2) 对于每类事件,都有一个接口,这个接口必须由想接收这个事件的类的对象实现。这个接口还要求定义一个或多个方法。当发生特定的事件时,就会调用这些方法
2).事件类的结构图:不需要记,用的时候学会查看JDK文档即可
图80-2: 事件类结构图
3).方法类型和接口
图80-3:常用事件方法类型和接口
demo程序如下:
package com.ahueir.awt; import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.Date; public class MyFrame2 { public static void main(String[] args) { Frame frame = new Frame("My Frame2"); /* * 在JDk 中查找frame类里面的addXxxListener类似的方法,找不到再从其父类中寻找 */ frame.addWindowListener(new MyWindowListener()); Button button = new Button("Click Me"); button.addActionListener(new MyListener()); frame.add(button); frame.setSize(200, 200); frame.setVisible(true); } } class MyListener implements ActionListener{ @Override @SuppressWarnings("deprecation") public void actionPerformed(ActionEvent e) { /* * 时间就是按格林威治时间:January 1, 1970, 00:00:00 GMT.到当前所经历的毫秒数。 * 将这个毫秒数转化为时间 */ long milliSeconds = e.getWhen(); /* * 查看JDK Doc文档中的Date类的 public Date(long date) */ Date date = new Date(milliSeconds); System.out.println(date.toLocaleString()); } } class MyWindowListener implements WindowListener{ @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowClosing(WindowEvent e) { System.out.println("关闭窗口"); System.exit(0); //推出Java虚拟机 } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } }
编译执行结果产生一个窗口,这里不截图出来了,输出以下内容:
2013-1-13 21:25:39
关闭窗口
3. 下面我们联系以下两个监听器的使用方法:
Demo程序如下所示:
package com.ahueir.awt;
import java.awt.BorderLayout;
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;
public class TwoListen implements MouseListener, MouseMotionListener{
private Frame frame;
private TextField textField; //文本框
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
//当鼠标退出Frame后,在命令行中打印出信息
@Override
public void mouseExited(MouseEvent e) {
String str = "The mouse has left the Frame";
this.textField.setText(str);
}
//鼠标拖动的时候,注意是点击拖动
@Override
public void mouseDragged(MouseEvent e) {
/*
* 对于图形界面来说,窗口的坐上角是起点
*/
String str = "x: " + e.getX() + ", y:" + e.getY();
this.textField.setText(str); //将鼠标拖动获得的信息加到文本框中
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
public void go(){
frame = new Frame("Two Listener Example");
frame.add(new Label("click"), BorderLayout.NORTH); //添加一个 Label:标签
textField = new TextField(30); //表示文本框的长度为30
frame.add(textField, BorderLayout.SOUTH);
frame.addMouseMotionListener(this); //使用this表示直接使用本类中当前的对象
frame.addMouseListener(this);
frame.addMouseListener(new MyMouseListener());
frame.setSize(300, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
TwoListen two = new TwoListen();
two.go();
}
}
class MyMouseListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
String str = "The mouse has entered the Frame";
System.out.println(str);
}
@Override
public void mouseExited(MouseEvent e) {
String str = "The mouse has exited the Frame";
System.out.println(str);
}
}
编译执行结果如图所示:
【说明】:对于同一个事件源,注册两个同种类型的监听器是没有问题的,而且他们同时的都会发生作用。如下图所示:
【说明】:同一个事件源触发三种相同的事件类型,这三个事件处理器都会执行
相关文章推荐
- Java 事件模型基础:监听器、事件、事件源、事件注册
- 第四十课、拖放事件深度剖析------------------狄泰软件学院
- asp.net中如何把应用程序错误写入事件日志(注册事件源)
- 手把手教你读懂源码,View事件的注册和接收详细剖析
- JavaSE第五十二讲:HashSet 与HashMap源代码深度剖析
- JavaSE第六十七讲:InvocationHandler接口与Proxy类深度剖析
- JavaSE 事件监听器接口
- 为Button点击事件注册监听器的两种方法
- 事件监听器原理——事件对象、事件监听器、事件源
- 深度剖析Byteart Retail案例:领域事件(Domain Events)
- Android界面控件(3)— 注册同一个点击事件的监听器
- 注册时钟事件监听器
- JavaSE第三十讲:String类陷阱深度剖析
- JavaScript DOM在对象上注册事件监听器__John Resig的addEvent()方法解析
- Android界面控件(2)—注册点击事件监听器
- JavaSE第一百零三讲:wait及notify方法全名、深度剖析
- Android中进行事件处理?事件源、事件处理类、注册事件监听
- Swing事件源通常可能触发事件及对应事件监听器
- JavaSE第八十一讲:AWT事件模型剖析 续
- [KinectWPF程序]Kinect初始化&彩色&深度数据 注册AllFrameReady同步事件方式