分享
 
 
 

事件监听器: 将JavaBeans接通起来的方法

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

通 过 适 当 配 置,JavaBeans 能 够 去" 监 听" 其 它 软 件 对 象。 而 且 正 如 你 将 要 看 到 的 一 样, 一 个Java1。1 类( 包 括 任 何 一 个JavaBeans) 一 旦 成 为 一 个 事 件 监 听 者, 就 不 仅 仅 只 能 够 监 听 其 父 类, 而 且 能 够 监 听 所 有 产 生 事 件 的 类。 事 件 监 听 者 的 思 想 正 是Java 类( 和 其 它JavaBeans) 如 何 处 理 事 件 的 关 键。

我 先 来 介 绍 两 个 图 标, 它 们 将 帮 助 我 们 识 别 一 些 关 键 问 题。

JavaBeans 是 一 个 重 要 概 念

Cuppajoe 图 标 表 示 对 于Java 语 言 来 说 新 的 或 重 要 的 思 想

什 么 是 事 件

软 件 事 件 是 一 段 说 明 某 事 已 经 发 生 的 数 据。 用 户 移 动 鼠 标, 或 从 网 上 传 来 数 据 报, 或 传 感 器 监 测 到 某 人 非 正 常 介 入, 所 有 这 些 发 生 的 情 况, 都 可 以 被 看 成 是 事 件 的 实 例, 而 有 关 这 些 情 况 的 信 息 可 以 包 括 在 事 件 之 中。 通 常 情 况 下, 根 据 事 件 处 理 来 开 发 软 件 系 统 是 较 为 方 便 的: 在 此 情 况 下, 程 序 设 计 变 成 一 种 对" 当 此 发 生 时, 做 彼" 式 的 叙 述 进 行 加 工 处 理 的 过 程。 如 果 鼠 标 已 被 移 动, 则 随 之 移 动 屏 幕 上 的 光 标; 如 果 网 上 传 来 数 据 报, 则 读 之; 如 果 发 现 有 人 侵 入, 则 驱 逐 之。

通 常 而 言, 一 个 事 件 包 括 以 下 信 息: 事 件 源( 产 生 事 件 或 最 初 接 收 到 事 件 的 对 象), 事 件 的 发 生 时 刻, 和 一 些 事 件 接 收 者 可 能 用 到 的 说 明 什 么 情 况 发 生, 如 何 去 做 的 子 类 的 具 体 信 息。 例 如, 在Windows 系 统 中, 就 应 当 有 一 个 关 于 点 击 鼠 标 的 事 件 子 类。 点 击 鼠 标 事 件 将 包 括 点 击 鼠 标 时 的 时 刻; 也 可 能 包 括 当 点 击 发 生 时, 鼠 标 在 屏 幕 上 的 位 置,SHIFT 键 和ALT 键 的 状 态, 是 点 击 了 鼠 标 左 键 还 是 右 键 等 等 诸 如 此 类 的 信 息。 处 理 事 件 的 编 码, 不 可 思 议 地 被 称 为" 事 件 处 理 者"(event handler)。

那 么, 所 有 这 些 与JavaBeans 有 何 关 系 呢? 事 件 是Beans 相 互 通 讯 的 主 要 方 式。 这 点 我 们 在 下 面 将 会 看 到。 如 果 你 正 确 地 选 择 了 事 件 和 它 们 的 连 接, 你 就 可 能 在 你 的 应 用 系 统 中 将Beans 相 互 接 通, 让 每 一 个Beans 按 照 你 的 意 愿 去 响 应 与 其 相 关 的 事 件。 每 一 个Beans 将 各 负 其 责, 对 新 来 的 事 件 进 行 适 当 地 响 应, 并 且 当 新 的 情 况 出 现 的 时 候, 向 相 关 的 邻 居Beans 发 送 新 的 事 件。 一 旦 你 知 道 如 何 利 用 事 件, 你 就 能 够 写 出 通 过 事 件 和 其 他 组 件 进 行 通 讯 的Beans。 更 进 一 步 地 讲, 外 部 系 统, 例 如 集 成 开 发 环 境(IDEs) 能 够 自 动 地 检 测 你 的Beans 所 用 的 事 件, 并 能 让 你 以 图 解 的 方 式 来 互 连Beans。IDEs 同 样 也 能 向JavaBeans 发 送 事 件 和 从JavaBeans 接 收 事 件, 本 质 上 讲, 可 以 从 外 部 来 控 制JavaBeans。

为 了 了 解 事 件 怎 样 和Beans 一 起 工 作, 你 就 必 须 了 解 他 们 在Java 中 是 如 何 工 作 的。 而 事 件 工 作 的 方 式 各 不 相 同,JDK1。1 则 是 标 准 的。

JDK 1。0 的 事 件 机 制 有 何 问 题?

在JDK1。0 中, 事 件 主 要 被 用 在 抽 象 视 窗 工 具 包(AWT) 中, 当 在 用 户 接 口 上 出 现 某 种 情 况 时, 它 将 通 知 相 应 的 类。 程 序 员 应 用 继 承 机 制, 通 过 创 建 某 个 类 的 能 够 接 收 相 应 的 事 件 类 型 的 子 类 对 象 和 重 载 父 类 的 事 件 处 理 过 程, 来 进 行 事 件 处 理。

例 如, 在Java1.0 版 中, 能 够 获 得 某 个 行 为 事 件(action event) 的 唯 一 途 径, 就 是 把 它 从 某 个 知 道 如 何 处 理 此 行 为 事 件 的 类 中 继 承 下 来。

public class MyButton extends java.awt.Button

{

//重载action()方法以处理行为事件

public boolean action(Event evt, Object what)

{

//此处,做一些行为事件所做的事

}

}

这 意 味 着, 只 有 从java。awt。button 中 继 承 下 来 的 类 才 能 够 响 应 点 击 鼠 标 事 件。 这 种 组 织 结 构 与 用 户 接 口 捆 绑 在 一 起, 不 够 灵 活 方 便。 它 不 便 于 构 造 新 的 事 件 类 型。 而 且 即 便 你 能 够 构 造 新 的 事 件, 你 也 很 难 改 变 那 些 将 被 类 响 应 的 事 件, 因 为 有 关 的 信 息 都 被 僵 硬 地 固 化 在AWT 的" 族 系 树"( 继 承 图) 中。

新 的JDK1。1 拥 有 一 个 更 为 普 适 的 事 件 框 架, 它 能 够 让 产 生 事 件 的 类 和 其 它 不 产 生 事 件 的 类 互 相 通 讯。 新 的 模 式 放 弃 了 定 义 客 户 子 类 必 须 重 载 的 事 件 处 理 函 数( 方 法) 的 工 作 方 式, 转 而 采 用 定 义 接 口 的 方 式。 如 果 一 个 类 需 要 接 收 某 一 特 定 的 消 息 类 型, 则 这 个 类 可 以 使 用 所 定 义 的 接 口。( 你 可 能 会 明 白, 这 意 味 着 通 过" 授 权"(delegation), 而 不 是 通 过" 继 承"(inheritance) 来 处 理 事 件)。 我 们 将 还 以JDK1。0 button 例 子 来 说 明JDK1。1 的 模 式。

我 在 此 想 要 做 的 事 是, 构 造 一 个 新 的 类, 使 它 能 够 在 按 钮 被 按 下 时, 去 做 某 件 事 情。 在JDK1。0 版 中, 为 了 处 理 与 按 钮(Button) 行 为 相 关 的 事 件, 我 必 须 继 承java。awt。Button, 这 样, 一 旦 某 个 按 钮 被 按 下 时, 该 按 钮 将 会 让 我 的 新 类 知 道。

//...在程序的另一个地方,我们定义了"监听"按钮行为的对象

ActionListener myActionListener = new ActionListener();

//...

//按钮行为事件

public class MyButton extends java.awt.Button

{

//重载action()以通知我的新类

public boolean action(Event evt, Object object)

{

myActionListener.action(evt, object);

}

}

现 在, 每 当MyButton 被 按 下 时,myActionListener 对 象 都 会 收 到 一 个 事 件。myActionListener 并 非 一 定 要 是java。awt。Component 的 一 个 子 类, 但 它 的 确 要 包 括 一 个action() 方 法。 我 们 把 这 个 新 类 称 为ActionListener, 是 因 为 这 个 新 类 一 直 将 要" 监 听" 它 所 依 附 的Botton 的 行 为 事 件。 在 此, 仍 有 一 些 问 题 存 在:

当 按 下 此 按 钮 时, 将 要 通 知 的 对 象 是 固 定 在 程 序 中 的, 这 就 是 说, 我 不 能 在 程 序 运 行 时 刻(runtime)" 重 新 接 通"Button 和myActionListener 的 关 系。

仅 有 一 个 对 象 可 被 通 知 到; 如 果 其 它 几 个 对 象 都 与 点 击Button 有 关 系, 这 该 如 何 解 决?

我 们 仍 然 没 有 解 决 通 过" 继 承" 来 接 收 按 钮 行 为 事 件 的 难 题-- 这 就 是 说,myActionListener 仍 必 须 从 某 个" 了 解" 按 钮 及 其 行 为 事 件 的 类 中 继 承 下 来。

对 第 一 个 问 题, 有 一 个 可 供 选 择 的 办 法 是 在MyBotton 类 中 增 加setListener(ActionListener newListener) 及myNewClass getListener() 两 个 方 法, 和 一 种 能 更 换 被 通 知 的 对 象 的 途 径。 然 而 非 常 不 幸, 我 们 仍 然 不 能 仅 仅 局 限 于 为 每 一 个 按 钮 关 连 一 个 对 象, 因 而 下 面 你 将 看 到, 我 们 将 生 成 一 系 列 的 监 听 器(listeners)。

//按钮行为事件( button action event)

public class MyButton extends java.awt.Button

{

private Vector listeningObjects = new Vector();

//重载action()以通知我的新类

public boolean action(Event evt, Object object)

{

for (int i = 0; i

好 了 , 现 可 以 看 到 , 任 何 一 个ActionListener 的 实 例 都 可 以 通 过 调 用addActionListener(this)" 监 听" 任 何 一 个Mybutton 实 例 上 的 事 件 , 并 且 通 过 调 用removeActionListener(this) 结 束" 监 听"。 这 一 进 步 的 确 不 错 , 但 是 有 关" 继 承" 的 问 题 仍 然 困 绕 着 我 们: 只 有Button 和ActionListener 对 象( 及 其 派 生 类 对 象) 才 能 接 收 到Button 行 为 事 件。 对 此 ,Java 有 着 新 的 解 决 路 线: 接 口。

接 口 和 事 件 监 听 器

在Java 术 语 表(http://Java。sun。com/docs/glossary。Html) 中 将 接 口 定 义 如 下:

接 口(interface): 在Java 中 , 是 一 组 特 定 的 方 法 , 这 些 方 法 可 以 在 多 个 不 同 的 类 中 实 现 , 而 不 必 考 虑 这 些 类 在 类 系 结 构 中 的 等 级 关 系。

为 什 么 它 会 如 此 有 用?

接 口 定 度 了 一 “角 色”,通 过 实 现 这 一 接 口 中 的 一 系 列 操 作 , 每 一 个 类 都 可 以 扮 演 接 口 的 角 色 。

接 口 的 定 义 和 类 的 定 义 看 起 十 分 相 似:

// 仍 在JDK1.0 内

public interface ActionListener

{

void action(Event evt, Object obj

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有