站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题控制bean定制器的技巧

控制bean定制器的技巧

摘要: 控制bean定制器的技巧
内容: 概 要: 集 成 开 发 环 境(IDEs) 可 以" 解 剖" 一 个bean 类 的 文 件 并 且 生 成 一 个 带 参 数 的 对 话 框, 开 发 者 可 以 利 用 它 来 定 制 自 己 的bean。 但 是 这 些" 标 准 的" 定 制 对 话 框 留 下 了 很 多 参 数 以 满 足 它 的 适 应 性, 灵 活 性 和 美 学 目 的, 本 文 论 述 的 是 怎 样 在 设 计 时( 当 然, 有 时 也 在 运 行 时) 定 制bean。 这 两 个 月 你 将 要 学 习 怎 样 定 制 你 的beans。

我 们 希 望 我 们 的 beans 不 仅 让 用 户 易 用, 更 重 要 的 是 使 应 用 程 序 的 开 发 者 方 便 的 通 过 改 变 参 数 来 设 计 自 己 的bean。 在11 月 号 的 专 题 文 章 定 制 你 的Java—— 根 据 应 用 剪 裁JavaBeans 里, 我 们 看 到 了 怎 样 定 制JavaBeans。 一 个 简 单 的 命 名 方 案(nameing scheam) 提 供 了 一 个 最 小 化 机 制, 这 个 机 制 使 用 户 可 以 在 一 个 集 成 开 发 环 境(IDE) 或 其 他bean 的 对 象 集 成 环 境-- 如BeanBox 里 定 制bean。 当 要 定 制 一 个bean 时, 这 个 集 成 开 发 环 境(IDE) 确 定 这 个bean 的 类 并 弹 出 一 个 对 话 框, 每 一 个 属 性 都 有 自 己 的 子 编 辑 框。 而 控 制, 替 换 和 扩 展 这 些 编 辑 框 正 是 本 文 要 讨 论 的 问 题。

本 文, 我 们 将 回 顾 一 下 基 础 概 念, 以 便 于 理 解JavaBeans 的 独 特 的 定 制 方 便 性。 你 将 要 了 解 到 实 现Bean 的 不 同 的 步 骤 和 类。 然 后 我 们 将 讲 述 一 个 用BeanInfo 界 面 生 成 的 简 单 构 件(form), 这 个form 讲 明 了 如 何 配 置 一 个bean。 我 们 还 将 写 一 个 很 简 单 的 定 制 属 性 编 辑 器( 它 使 你 方 便 的 编 辑 属 性) 并 把 它 装 在BeanBox 里。 这 个 过 程 中 我 们 将 接 触 到Introspector 类, 所 谓Introspector 类 是 一 种 被 集 成 开 发 环 境(IDE) 或 其 他 bean 集 成 环 境 用 来 分 析 类 文 件 的JavaBeans 类。

注 意: 本 文 中, 我 使 用 的 术 语IDE 指 的 是" 任 何 涉 及 到bean 内 部 的bean 集 成 环 境"。 它 当 然 不 局 限 于IDEs: 指 像BeanBox, 信 息 公 路(information"buses") 等 类 似 于 此 的, 需 要 知 道bean 内 部 情 况 的Beans 浏 览 器,Bean 测 试 器。 我 使 用"IDE" 只 因 为 它 只 需 三 个 字 母, 而 且 在 本 文 中 很 常 用。

定 制 的 步 骤(levels)
由 于bean 越 来 越 复 杂, 属 性( 或 称 存 取 方 法) 越 来 越 多。 更 多 的 属 性 出 现 在 对 话 框 里, 于 是 我 们 用 来 定 制 bean 的 对 话 框 越 便 越 大, 使 用 起 来 很 不 方 便, 容 易 混 乱。

bean 的 使 用 者 不 一 定 很 清 楚 它 的 属 性 的 意 义 以 及 它 们 之 间 的 联 系。 某 些 属 性, 特 别 是 索 引 属 性, 在 没 有 屏 幕 时 很 不 好 理 解。 另 一 些 如 果 在 图 形 状 态 下 编 辑 会 很 容 易 理 解。

JavaBeans 规 范 和JavaBeans 包 解 决 了 这 个 问 题, 原 因 是 它 灵 活, 开 放, 易 扩 展 的 规 定, 分 类 和 界 面。 这 就 使bean 的 开 发 者 可 以 了 解 用 户 将bean 加 入 自 己 的 程 序 中 来 定 制 它 时 的 屏 幕 显 示。

当 统 一 设 计 面 板 和 让IDE 创 制 自 己 的 对 话 框 时, 为 了 写 一 个 使 用 户 可 以 在 全 图 形 用 户 界 面( complete GUI) 下 自 己 配 置 的 bean , 定 制 控 制 分 为 几 步(levels)。

定 制 步 骤(level)1: 使 用 设 制 模 板
如 果 你 已 经 读 过 这 个JavaBeans 系 列 的 上 一 篇 关 于 定 制bean 的 文 章, 你 已 经 知 道 存 取 方 法 可 以 改 变bean 的 内 部 状 态。 你 还 会 记 得 设 制 模 板(design pattern) 是JavaSoft 用 来 表 示 存 取 方 法 的 术 语, 是 根 据"JavaBeans 规 范" 的 命 名 规 则 定 义 的, 所 以 它 们 的 程 序 包 可 以 表 示 出 所 有 的 属 性 和 设 置 方 法。 如 果 你 没 有 读 过 上 述 文 章, 我 来 做 一 个 小 结: 属 性 是 一 个 软 件 对 象 的 内 部 状 态 的 子 集( 这 里 的 软 件 对 象 指 的 是bean)。 属 性 的 存 取 方 法 提 供 了 改 变 一 个bean 的 某 个 外 部 特 性 的 唯 一 方 法。JavaBeans 规 范 中 规 定 每 一 个 属 性 必 需 有 像 这 样 的 存 取 方 法

SomeType getProperty() (getter)
void setProperty(SomeType value) (setter)

如 果JavaBean 遵 守JavaBeans 规 范, 集 成 开 发 环 境 就 可 以 分 析 一 个bean, 找 到 名 字 附 和 上 述 模 式 的 存 取 方 法 并 且 指 出 它 的 属 性 和 设 置 方 法。 当IDE 知 道 属 性 的 名 字, 类 型 和 存 取 方 法 后, 它 立 即 可 以 生 成 一 个 定 制 对 话 框。 如 果 你 对 这 段 不 是 很 理 解, 可 以 参 阅 我 上 面 提 到 的11 月 号 的 关 于"JavaBeans" 的 文 章。

这 样, 你 已 经 学 会 了 定 制 的 最 基 本 的 步 骤 : 设 制 模 板。 这 是IDEs 和 其 他bean 软 件 包 提 供 给 应 用 程 序 开 发 者 定 制 一 个 bean 的 最 基 础 的 方 法。

如 果 只 依 赖 于 设 制 模 板 做 为 定 制 的 界 面, 存 在 着 几 个 问 题。 首 先, 由 于IDE 只 知 道 对 象 的 名 字 和 属 性, 而 不 知 道 属 性 的 意 义, 大 部 分 将 按 照 字 母 顺 序 排 列 或 按 某 种 顺 序 列 表。 你 的 定 制 对 话 框 将 整 齐 但 不 实 用。 对 话 框 也 会 非 常 巨 大。 回 忆 一 下 我 们 在 上 几 篇 文 章 中 开 发 的BarChartBean 程 序。 如 下 图:


BarChartBean 和 它 的 定 制 对 话 框( 属 性 单)

这 是 一 个 简 单 漂 亮 的bean, 但 请 看 一 下 它 的 属 性 表 ! 我 可 以 轻 而 易 举 地 举 出 成 打 的 很" 酷" 的 属 性 加 在 上 面: 旋 转, 立 体 效 果, 色 彩 变 幻 等 等。 那 么, 再 设 想 一 下 用 这 个 方 法 配 置 电 子 制 表 软 件 或 字 处 理 软 件 bean: 毫 不 夸 张 得 说 将 有 成 百 的 属 性 列 一 个 长 长 的 表。

这 里 也 有 很 多 你 并 不 想 列 出 的 属 性。 如, 上 图 中 BarChartBean 右 边 的 对 话 框 里 的 几 个 属 性 象 字 体, 前 景, 背 景, 它 们 与BarChartBean 毫 无 关 系。(BarChartBean 不 使 用 文 字, 并 且 总 处 于 最 大 化。) 因 为 这 些 属 性 继 承 于java.awt.Component 所 以 它 们 列 在 这 里。

BeanBox 尽 力 把 它 所 知 的BarChartBean 的 点 滴 列 给 你, 但 它 超 过 了 你 的 要 求。BarChartBean 出 现 时 我 不 需 要 所 有 这 些 属 性, 它 还 会 把 你 搞 胡 涂。" 背 景" 和" 填 充 色" 有 什 么 区 别 ?( 设 计 者 当 然 知 道, 但 使 用 者 不 一 定 清 楚 ) 看 来 最 好 把 与 用 户 无 关 的, 会 带 来 麻 烦 的 属 性 隐 藏 起 来。

定 制 步 骤(level)2: 提 供BeanInfo 对 象
定 制 的 第 二 步,java.beans.BeanInfo 的 界 面 里 解 决 了 这 些 问 题。BeanInfo 界 面 使 你 的bean 向 每 一 个" 要 求" 的 用 户 描 述 自 己(" 要 求" 这 个 词 我 将 在 后 面 介 绍)。 除 了 显 示 属 性,BeanInfo 界 面 还 可 以 显 示 名 字, 图 标, 属 性 列 表, 方 法, 事 件 等 等。( 我 们 将 在 下 一 段 里 更 深 的 讨 论BeanInfo)。 很 多 属 性 用 简 单 的 设 置 整 数, 颜 色 或 文 件 的 方 法 不 能 很 好 的 表 示。 象 是 常 见 的 枚 举 类 型: 也 许 我 只 想 在 下 拉 列 中 设 几 种 色 彩( 绿 色, 黄 色 等)。 另 外 的 人 也 许 要 在 一 个Tabbean 中 设 置 制 表 符( 如 字 处 理 程 序 中 一 个PageLayout bean 的 子 构 件)。 设 制 模 板 和 BeanInfo 不 能 直 接 控 制 这 些 情 况, 而java.beans.PropertyEditor 的 界 面 功 能 使 程 序 员 能 直 接 在 图 形 界 面 下 设 置 参 数; 换 言 之, 你 可 以 写 属 性 编 辑 器。

定 制 步 骤(level)3: 提 供 定 制 属 性 编 辑 器
定 制 的 第 三 步,java.beans.PropertyEditor 和 java.beans.PropertyEditorSupport, 使 你 能 写 自 己 的 属 性 编 辑 器。 属 性 编 辑 器 是 一 个 单 独 编 辑 具 有 一 定 类 型 的 属 性 的 构 件。 当 你 击 中"Color" 设 置 颜 色 时 , 会 弹 出 BeanBox 里"Color" 属 性 的 标 准 编 辑 器:


使 用ColorEditor 属 性 编 辑 器

你 看 到 的 这 个 对 话 框 是 BeanBox 用 来 编 辑"Color" 属 性 类 的 标 准 属 性 编 辑 框。PropertyEditor 界 面 允 许 你 发 明 新 类 型。

PropertyEditor 界 面 通 过 对 标 签(tags) 的 支 持 使 你 实 现 枚 举 类 型。

某 些 属 性 由 一 个 软 件 构 件 中 的 几 个 实 际 的 属 性 组 成, 可 以 认 为 是" 逻 辑" 属 性。" 逻 辑" 属 性 的 一 个 最 好 的 例 子 是 彩 色 板(color balance), 它 在 一 个 面 上 显 示 各 种 色 彩。 你 可 以 在 这 个 标 准 属 性 列 里 选 择 属 性 如" 红" 或" 黄", 但 不 必 在 应 用 时 列 给 用 户。 显 示 色 彩 板 的 最 好 方 式 大 概 是: 把 图 像 用 当 前 色 彩 显 示, 在 它 周 围 用 thumbnails 表 示 变 化。 用 户 可 以 选 择 最 满 意 的 图 像, 对 话 框 对 这 幅 图 像 再 做 编 辑。(Adobe PhotoShop 里 的 对 话 框 类 似 于 此)。

定 制 步 骤(level)4: 提 供 定 制 器
定 制 控 制 的 第 四 步 是java.beans.Customizer 界 面, 使 用 它 你 将 完 成 用 你 的bean 代 替 集 成 开 发 环 境 的 标 准 属 性。 随 着bean 一 起 产 生 了 一 个 自 定 义 的 说 明, 使 用 它 可 以 配 置 你 的bean。

如 果 设 计 得 当, 用 户 在 设 计 应 用 程 序 时 可 以 把 定 制 对 话 框 看 成 子 构 件 用。 如 果 你 有 一 个PrintBean 构 件 管 理 打 印 作 业, 这 样 的 界 面 你 能 抗 拒 吗 ?


属 性 表

定 制 器


怎 样 在bean 集 成 环 境 里 定 制bean
我 介 绍 的 这 些 定 制 控 制 不 仅 是 为 了 提 高 性 能, 同 样 减 少 了 复 杂 程 度。 定 制 一 个bean 时,IDE 需 要 它 的 定 制 信 息(BeanInfo)。IDE 通 过 这 些 信 息 知 道 了 定 制 器 的 类。 定 制 器 类 包 括 用 户 描 述 的 类IDE 创 建 的 属 性 单。IDE 创 建 的 定 制 对 话 框 里 每 个 属 性 都 有 属 性 编 辑 框。 你 可 以 想 到, 这 些 属 性 来 自BeanInfo 对 象; 如 果IDE 没 有 找 到BeanInfo 对 象, 则 探 测(introspection)bean 内 部 找 出 它 的 属 性。

在 我 们 讨 论 怎 样 使 用 BeanInfo 类 之 前, 先 回 顾 一 个 重 要 概 念:Introspector.

Introspector 类: 解 剖 一 个bean
我 曾 提 到IDEs 和 其 他 与bean 有 关 的 集 成 环 境 向bean" 请 求"("ask")BeanInfo 对 象。 那 么, 什 么 是" 请 求" 呢 ?

java.beans.Introspector 类 主 要 被 用 来 测 出bean 的 性 能。IDEs,BeanBox,beans-aware 浏 览 器, 等 等 需 要 知 道 一 些 定 制bean 的 方 法。Introspector 类 提 供 了 这 个 界 面。 做 为 一 个bean 的 开 发 者, 尽 管 你 可 能 永 远 也 不 会 亲 自 用 到Introspector 类, 但 你 应 该 知 道 他 是 什 么, 因 为 当 你 写BeanInfo 对 象 时Introspector 是 你 的 观 众。Introspector 搜 寻 你 的bean 的 类 文 件, 是 为 了 找 出bean 的 功 能, 定 制 方 法 等。 我 们 前 面 提 到 的" 设 制 模 板" 就 是 寻 找 这 些 的 线 索。 Introspector 类 遵 守JavaBeans 规 范 的 命 名 规 则, 并 假 定 类 的 开 发 者 也 同 样 遵 守 这 些 规 则。 比 如:Introspector 找 到 名 为int getElvis() 和void setElvis(intiElvis) 的 两 个 方 法, 它 假 定bean 有 一 个 名 为"Elvis" 的 属 性, 并 把 这 个 信 息 加 到 属 性 列 表 里。

对 你 极 为 有 利 的Introspector 方 法 写 法 如 下:

public static BeanInfo getBeanInfo(Class beanClass) throws
IntrospectionException

IDE 使 用 这 个 方 法 找 出BeanClass 的 定 制 方 法。(BeanClass 是 一 种 类 的 对 象, 它 是 你 的bean 的 类 对 象( class object), 加 载 在JVM 里)。 无 论 你 是 否 提 供 了BeanInfo 对 象,Introspector 都 会 生 成 一 个。 如 果 你 的bean 没 有 提 供BeanInfo 对 象,Introspector 会 使 用 Java 映 射 机 制 生 成 一 个 用 来 分 析bean 的 类 文 件。 它 寻 找 与JavaBeans 规 范 里 的 设 制 模 板 一 致 的 存 取 属 性, 事 件 集 合 方 法。 因 此 你 可 以 想 到 它 的 格 式,IDE 的 格 式 大 致 如 下:

Class theBeanClass = Class.forName(className);
Introspector clouseau = new Introspector;
BeanInfo BeanInfo = clouseau.getBeanInfo(theBeanClass);

如 果 没 有 意 外,BeanInfo 里 饱 含 了bean 的 所 有 有 用 信 息; 现 在 我 们 就 来 看 看BeanInfo 究 竟 做 些 什 么。

来 看 看BeanInfo 界 面 ?

BeanInfo 界 面 是 整 个 定 制 过 程 中 的 关 键。 当IDE( 或 其 他 集 成 环 境) 向 一 个Introspector 对 象" 要"bean 的BeanInfo 时,Introspector 则 寻 找 一 个 名 为"BeanNameBeanInfo" 的 类-- 即 一 个 名 字 以 "BeanInfo" 为 后 缀 的 bean。 它 首 先 在bean 的 软 件 包 里 找, 如 果 没 有 就 去CLASSPATH 下 找。( 如 果 你 想 知 道 的 更 详 细, 请 阅 读JavaBeans 规 范。) 如 果Introspector 找 到 了BeanInfo 类, 生 成 一 个 例 子 并 返 回; 否 则, 它 使 用bean 类 的 映 射 建 立 一 个BeanInfo 对 象。

BeanInfo 向 集 成 环 境 提 供bean 的 信 息。 它 向IDE 提 供 的 信 息 有:

显 示 名--bean 类 显 示 出 来 的 名 字
这 个 类 的 简 介
图 标
属 性 列 表( 及 存 取 方 法)
方 法 列 表( 及 参 数)
事 件 集 列 表-- 即 这 个 对 象 可 以 导 致 和/ 或 遵 守 的 事 件(events)

属 性, 方 法 和 事 件 集 信 息 返 回 为 一 个 对 象 的 数 组, 这 个 对 象 叫" 叙 词 表"-- 也 就 是javabean 的 特 征 叙 词 表(java.beans.FeatureDescriptor ) 的 子 集。 叙 词 表 的 每 个 对 象 描 述 bean 的 一 个 特 征。

BeanInfo 返 回 这 些 信 息 的 方 法 如 下:
getBeanDescriptor():
返 回 一 个Bean 叙 词 表(BeanDescriptor), 包 含bean 的 多 方 面 信 息( 图 标, 显 示 名 等)
getPropertyDescriptors(): 返 回 一 属 性 叙 词 表
getMethodDescriptors(): 返 回 一 方 法 叙 词 表
getEventSetDescriptors(): 返 回 一 事 件 集 叙 词 表

为 了 避 免 执 行 所 有 方 法, 生 成 一 个SimpleBeanInfo 类, 他 的 每 个 方 法 都 将 返 回 空。 虽 然 听 起 来 没 什 麽 用, 但 他 是 一 个 很 有 用 的 类。 如 果Introspector 发 现 每 个 返 回 都 为 空, 就 转 用 映 射 来 描 述 这 些 表。 这 就 使SimpleBeanInfo 可 以 给 你 的 新BeanInfo 类 一 个 有 用 的 基 本 类。 如 果 你 要 自 己 定 义-- 比 如 减 少 属 性 叙 词 表-- 你 只 要 修 改 相 应 的 方 法 并 让 其 他 的 方 法 的 返 回 值 不 变 就 可 以 了。 这 很 象 我 们 上 个 月 讨 论 的" 事 件 编 辑 器"(event adaptor)。

例 子: BarChartBean

首 先, 我 们 看 一 下BeanBox 里 为BarChartBean 缺 省 定 制 的 属 性 列 表, 它 有 一 些 会 把 用 户 搞 糊 涂 的 属 性。 让 我 们 创 建 一 个BeanInfo 类 来 控 制 属 性 的 可 视 性。

根 据 JavaBeans 规 范,BarChartBean 的BeanInfo 类 叫 做BarChartBeanBeanInfo。 我 们 可 以 只 留 下 少 数 属 性( 象percent, fillColor, and floodColor), 然 后 再 加 一 个 小 图 标: 并 给bean 一 个 显 示 标 签-- BarChart。 以 下 代 码 实 现 了 用BeanInfo 类 来 限 制 属 性 列 表 里 的 属 性 并 为Bean 加 了 一 个 小 图 标。

import java.beans.*;

public class BarChartBeanBeanInfo extends SimpleBeanInfo
{
private final static Class myClass = BarChartBean.class;

//
// note that here we create an array of 3 PropertyDescriptor
// objects. The constructor takes just the name of the property,
// and the bean class that implements it.
//
public PropertyDescriptor[] getPropertyDescriptors()
{
try {
PropertyDescriptor flc = new
PropertyDescriptor("floodColor",myClass);
PropertyDescriptor fic = new
PropertyDescriptor("fillColor",myClass);
PropertyDescriptor pct = new
PropertyDescriptor("percent",myClass);
PropertyDescriptor[] list = { flc, fic, pct };
return list;
}

catch (IntrospectionException iexErr)
{
throw new Error(iexErr.toString());
}
}

//
// This function returns a BeanDescriptor object, which specifies
// general miscellaneous information about the bean.
//
public BeanDescriptor getBeanDescriptor()
{
BeanDescriptor desc = new BeanDescriptor(myClass);
desc.setShortDescription("A configurable bar chart");
desc.setDisplayName("Bar Chart");
return desc;
}

//
// This function returns a small icon which, in the BeanBox,
// will appear in the Toolbox window next to the display name.
//
public java.awt.Image getIcon(int iType)
{
if (iType == BeanInfo.ICON_COLOR_16x16)
{
System.out.println("Getting image...");
return loadImage("BarChartIcon.gif");
}
return null;
}
};

我 们 把 这 个 类 的.class 文 件 和 文 件"BarChartIcon.gif" 一 起 放 在JAR 文 件 里-- 这 相 当 于 间 接 把 文 件 放 进 了 类 装 载 器(loader) 可 以 找 到 的CLASSPATH 里。 我 们 运 行 这 个BeanBox 时, 结 果 如 下 图:


更 新 后 的 属 性 列 表, 图 标 和 显 示 名

现 在, 只 有 返 回 到 属 性 叙 词 表 里 的 属 性 显 示 在 定 制 器 里。 而 且, 你 可 以 在 左 边 看 到bean 叫 做BarChart 并 有 一 个 小 图 标。

现 在 你 知 道 了 怎 样 隐 藏 和 显 示 属 性, 现 在 回 到 怎 样 编 辑 他 们 的 问 题 上 来。

属 性 编 辑 器
BeanBox 提 供 的 属 性 列 表 有 两 列: 一 列 是 属 性 名, 另 一 列 是 编 辑 属 性 用 的 框。 这 些 框 就 是 我 前 面 提 到 的 属 性 编 辑 器, 他 们 做 为 构 件 各 有 自 己 的 属 性( 下 个 月, 我 们 将 学 习 怎 样 在builder tool 环 境 下 重 用 或/ 和 重 置 他 们。) 你 假 设 你 已 经 有 了 一 个 BeanInfo 对 象。

这 个BeanBox 里 没 有 字 符 串 属 性, 我 们 加 一 个 颜 色 组 合( ColorScheme), 当 给 定 一 个 合 法 值, 它 将 设 置BarChartBean 里 的 填 充 色。 执 行 代 码 如 下:

String colorScheme_;

public BarChartBean()
{
// Must be valid on construction
setColorScheme("Default");

//... continue with previous constructor code...
}

//...
public String getColorScheme()
{
return colorScheme_;
}

public void setColorScheme(String scheme)
{
if (scheme == "Atrocious")
{
setFloodColor(new Color(10, 75, 10));
setFillColor(new Color(255, 128, 128));
colorScheme_ = scheme;
}
else if (scheme == "Hideous")
{
setFloodColor(new Color(255, 255, 0));
setFillColor(new Color(255, 95, 255));
colorScheme_ = scheme;
}
else if (scheme == "Revolting")
{
setFloodColor(new Color(255,12,128));
setFillColor(new Color(120, 240, 45));
colorScheme_ = scheme;
}
else if (scheme == "Drab")
{
setFloodColor(new Color(120,120,12));
setFillColor(new Color(200, 200, 0));
colorScheme_ = scheme;
}
else
{
// Else use default
scheme = "Default";
}

if (scheme == "Default")
{
setFillColor(Color.blue);
setFloodColor(Color.red);
colorScheme_ = scheme;
}
}
java.beans.PropertyEditorSupport

提 供 了 方 便 的 界 面 为 简 单 枚 举 类 型 建 立 属 性 编 辑 框。

java.beans.PropertyEditorSupport

是 另 一 个 可 以 让 用 户 重 载 自 己 需 要 的 成 员 的 实 用 程 序。 在 这 个 程 序 里 我 们 只 需 重 载 一 个 函 数,String[]

getTags(), 让 他 可 以 返 回 这 个 枚 举 类 型 范 围 内 的"tags" 列。 这 是 一 个 定 制 属 性 编 辑 器, 所 以 我 们 要 建 一 个 属 性 编 辑 器 类( 马 上 我 们 将 看 到 怎 样 做):

import java.beans.*;

public class BarChartColorSchemeEditor extends
java.beans.PropertyEditorSupport
{
public String[] getTags()
{
String ColorSchemes[] = {
"Default",
"Atrocious",
"Hideous",
"Revolting",
"Drab"
};
return ColorSchemes;
}
};

java.beans.PropertyEditor

界 面 下, 如 果getTags() 返 回 一 系 列 字 符 串, 一 个 下 拉 式 属 性 编 辑 器 将 加 在 属 性 列 表 中 来 编 辑 这 个 属 性。( 这 个 例 子 中, 指 属 性String)。 这 就 是 建 立 这 个 属 性 编 辑 器 所 要 做 得 一 切。 下 面, 我 们 需 要 把 这 个 新 属 性 编 辑 器 与 我 们 要 加 在BeanInfo 对 象 里 的 新 属 性 联 系 起 来。java.beans.PropertyDescriptoryou 由 一 个 叫setPropertyEditorClass(Class) 的 方 法 可 以 将 一 个 属 性 编 辑 器 与 属 性 联 系 起 来; 我 们 只 要 把 新 属 性 加 在BarChartBeanBeanInfo.getPropertyDescriptors() 里 的PropertyDescriptors 列 里。 我 们 还 要 把 新 属 性 与 我 们 的 新 类 联 系 起 来, 如 下:

public class BarChartBeanBeanInfo extends SimpleBeanInfo
{
private final static Class myClass = BarChartBean.class;

public PropertyDescriptor[] getPropertyDescriptors()
{
try {
PropertyDescriptor flc = new PropertyDescriptor("floodColor",
myClass);
PropertyDescriptor fic = new PropertyDescriptor("fillColor",
myClass);
PropertyDescriptor pct = new PropertyDescriptor("percent",
myClass);

PropertyDescriptor psc = new PropertyDescriptor("colorScheme",
myClass);
psc.setPropertyEditorClass(BarChartColorSchemeEditor.class);

PropertyDescriptor[] list = { flc, fic, pct, psc };

return list;
}

catch (IntrospectionException iexErr)
{
throw new Error(iexErr.toString());
}
}
//.. and so on...
}

这 就 是BeanInfo 对 象 的 接 收 器 怎 样 使 用 新 的BarChartColorSchemeEditor 类 编 辑BarChartBean 的ColorScheme 属 性。

当 加 载BarChartBean 时,BeanBox 寻 找BarChartBeanBeanInfo 对 象 并" 要" 一 个 属 性 叙 词 列 表。 对 每 一 个 叙 词, 构 他 向 属 性 列 中 加 一 个 属 性 编 辑 框。 对ColorScheme 属 性, 他 寻 找 属 性 编 辑 器 类(BarChartColorSchemeEditor) 并 用 它 代 替 缺 省 值。 注 意 构 造BarChartBean 时 要 给 这 个 属 性 一 个 缺 省 的 合 法 值, 否 则 寻 找 不 到BarChartColorSchemeEditor 就 看 不 到 这 个 属 性。

运 行 结 果 是 属 性 表 上 有 一 个 新 属 性, 他 用 下 拉 列 表 让 你 从 几 种 颜 色 中 选:


使 用 一 个 定 制 属 性 编 辑 器

总 结
本 月, 我 们 复 习 了JavaBeans 提 供 的 不 同 定 制 器, 初 步 学 习 了BeanInfo 的 使 用。 他 是bean 用 来 向 需 要 了 解 他 的 集 成 环 境 描 述 自 己 的 类。 下 个 月 我 们 将 集 中 学 习 编 写 和 注 册 自 己 的 属 性 编 辑 器, 并 写 一 个 完 整 的 定 制 器 来 替 代 缺 省 属 性 表。 还 将 深 入 讨 论BeanInfo 类 的 功 能。


Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd, scwcd 概 要:
↑返回目录
前一篇: JavaBeans教程
后一篇: Java,Beans和关系数据库的镜像