java 监听机制模拟(JButton按钮监听机制)
一、概念
1.事件监听器
事件监听器就我个人的理解就是:被外部事件(键盘、鼠标)引发的程序,这段程序是被嵌入到事件源的类里面,它负责监听事件列表。而很多人把事件监听器理解成是实现EventListener接口的类。
而我的理解是实现EventListener接口的类是事件处理器。里边有处理事件的方法。从逻辑上看是这样的,但是人家既然这样来命名了,那也没有办法。因为程序员只要知道这么去添加监听器就行了,不必理解内部的处理流程,但是作为一个热爱计算机的程序员来说,必须要理解其过程。
事件监听器的功能:
负责监听事件注册类表,有相关事件注册就立马 new 一个事件,然后调用事件处理器里的事件处理方法,完成事件处理。然后移除事件注册列表的相关事件。
2.事件源:
事件源是事件的起源,可以称作事件触发源。其主要的功能是,介绍外边事件,比如键盘、鼠标等,当有事件时就会触发事件监听器。
主成分:主要由事件监听器、注册事件方法(如:addActionListener)构成。
3.事件对象:
实现EventObject接口的类。里面封装了对事件源进行操作的方法。比如:getActionCommand()方法。
4.事件处理器
事件处理器是对事件进行处理的类,这类实现EventListener接口。此类由程序员编写。比如 事件处理器中的处理程序:
二、模拟程序
以JButton按钮为列,看一下程序:
1 |
import java.util.EventListener;
import java.util.EventObject;
import java.util.Vector;
//自定义一个按钮事件
class ActionEvent extends EventObject{
String actionCommand;
public ActionEvent(Object source,String command)
{
super(source);
this.actionCommand = command;
System.out.println("按钮点击事件产生!");
}
public String getActionCommand() {
return actionCommand;
}
}
// 弄一个在按钮里面使用的接口,通过继承此接口可以完成事件处理的类
interface ActionListener extends EventListener{
//这里是当事件发生后的响应过程
public void actionPerformed(ActionEvent me);
}
//再自定义一个监听器
class MyListener implements ActionListener
{
//这里是当事件发生后的响应过程
public void actionPerformed(ActionEvent me)
{
String str=me.getActionCommand();
if(str.equals("hello"))
System.out.println("按钮点击事件被处理");
}
}
//以下这个类为触发事件的事件源
class JButton { //比如button按钮
String s;
JButton(String s)
{
this.s=s;
}
String getAt()
{
return s;
}
private Vector vectorListeners=new Vector(); //定义一个向量
public synchronized void addActionListener(ActionListener actionlistener) //注册监听器
{
vectorListeners.addElement(actionlistener); // 将指定元素添加到此向量的末尾
System.out.println("按钮上注册监听器");
}
public synchronized void removeActionListener(ActionListener actionlistener) //移除监听器
{
vectorListeners.removeElement(actionlistener); //从此向量中移除变量的第一个(索引最小的)匹配项。
System.out.println("移除按钮上的监听器");
}
protected void activateMyEvent() //判断监听器是否监听到
{
Vector tempVector=null;
synchronized(this)
{
ActionEvent e;
e=new ActionEvent(this,getAt()); //产生了事件
tempVector=(Vector)vectorListeners.clone();
for(int i=0;i<tempVector.size();i++)
{
ActionListener actionlistener=(ActionListener)tempVector.elementAt(i); //调用监听器处理事件
actionlistener.actionPerformed(e); //处理事件
removeActionListener(actionlistener); //移除监听器
}
}
}
//定义一个公用方法用于触发事件 安装在按钮内部
public void Trigger()
{
System.out.println("按钮点击事件触发");
activateMyEvent();
}
}
public class Test {
public static void main(String[] args)
{
JButton button=new JButton("hello"); //事件源-->按钮
MyListener mylistener= new MyListener(); //定义监听器
button.addActionListener(mylistener); //在按钮上注册监听器监听按钮点击事件
button.Trigger(); //触发按钮事件
System.out.println("程序结束");
}
}
|
来自CODE的代码片
三、问题:
(理解以上概念及代码后,在看看以下问题)
1、以上只是模拟,那么Java中是如何通过点击按钮,然后触发按钮事件的,比如点击按钮就触发以上程序所提供的Trigger() 方法的?
java 监听机制模拟(JButton按钮监听机制)的更多相关文章
- Android开发 ---基本UI组件2:图像按钮、单选按钮监听、多选按钮监听、开关
Android开发 ---基本UI组件2 1.activity_main.xml 描述: 定义一个按钮 <?xml version="1.0" encoding=" ...
- Java 界面编程【03】事件监听
当你把界面都设计好了,总需要添加相应的执行动作给组件,在JAVA中有相应的时间处理机制,叫做“监听器”,给组件添加相应执行动作的过程叫做“注册”,其中的“监听器”是一个接口,里面包含了相应的执行函数, ...
- Java中用得比较顺手的事件监听
第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...
- [Java聊天室server]实战之二 监听类
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...
- Android 关于ListView中按钮监听的优化问题(方法二)
关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...
- Android 关于ListView中按钮监听的优化问题(方法一)
在Android应用开发过程中经常会用到ListView,并且每次在item中都要对点击事件进行监听.在给按钮添加OnClickListener时,一般会下意识的在getView()中找到每一个But ...
- 监听程序未启动或数据库服务未注册到该监听程序。启动该监听程序并注册数据库服务 然后重新运行 em configuration assistant。
在WIN 7/64Bit上安装ORACLE 11gR2后,管理网页Database Control(如:https://localhost:1158/em)始终登录不进去,总是说密码错误,使用配置工具 ...
- 问题1:Oracle数据库监听启动失败(重启监听,提示The listener supports no services)
编辑监听文件:/home/DB/oracle/11gR2/db/network/admin/listener.ora 在文件内添加静态监听实例,如下内容: SID_LIST_LISTENER =(SI ...
- 编写Java程序,将JButton按钮按网格布局管理器格式放置
返回本章节 返回作业目录 需求说明: 将JButton按钮按网格布局管理器格式放置 实现思路: 实现代码: public void init(){ setLayout(new GridLayout(4 ...
随机推荐
- 浅谈:nodejs在cmd提示不是内部或外部命令
今天用cmd安装个库,结果发现node不是内部命令,检查后发现上次重装nodejs换了个安装位置,path环境变量忘改了. 找到变量值中node的安装地址,比如C:develop\nodejs,如果不 ...
- 05JavaScript中的事件处理
JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...
- Microsoft SQL Server Transact-SQL
Microsoft SQL Server Transact-SQL 1.SQL 1.1数据定义语言(DDL) create 创建数据库或数据库对象:alter 修改数据库或数据库对象:drop 删除数 ...
- scala学习(3)-----wordcount【sparksession】
参考: spark中文官方网址:http://spark.apachecn.org/#/ https://www.iteblog.com/archives/1674.html 一.知识点: 1.Dat ...
- 洛谷——P2659 美丽的序列
P2659 美丽的序列 单调栈维护区间最小值,单调递增栈维护区间最小值, 考虑当前数对答案的贡献,不断加入数,如果加入的数$>$栈顶,说明栈顶的元素对当前数所在区间是有贡献的,同时加入当前的数. ...
- [Luogu] P1993 小K的农场
题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...
- hdu 1166敌兵布阵(线段树入门题)
>>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...
- Spring SpEL 各种写法示例
项目路径 先说一下三个bean都有哪些属性 Address.java private String city;//城市 private String street;//街道 Car.java priv ...
- Leetcode 114.二叉树展开为链表
二叉树展开为链表 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 将其展开为: class Solution{ public: void flatten(TreeNode* root){ if ...
- 模拟退火算fa
转载:http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html 优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 ...