概 要 集 成 开 发 环 境(IDEs) 可 以 解 剖 一 个bean 类 的 文 件 并 且 生 成 一 个 带 参 数 的 对 话 框 开 发 者 可 以 利 用 它 来 定 制 自 己 的bean 但 是 这 些 标 准 的 定 制 对 话 框 留 下 了 很 多 参 数 以 满 足 它 的 适 应 性 灵 活 性 和 美 学 目 的 本 文 论 述 的 是 怎 样 在 设 计 时( 当 然 有 时 也 在 运 行 时) 定 制bean 这 两 个 月 你 将 要 学 习 怎 样 定 制 你 的beans 我 们 希 望 我 们 的 beans 不 仅 让 用 户 易 用 更 重 要 的 是 使 应 用 程 序 的 开 发 者 方 便 的 通 过 改 变 参 数 来 设 计 自 己 的bean 在 月 号 的 专 题 文 章 定 制 你 的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 信 息 公 路(informationbuses) 等 类 似 于 此 的 需 要 知 道bean 内 部 情 况 的Beans 浏 览 器Bean 测 试 器 我 使 用IDE 只 因 为 它 只 需 三 个 字 母 而 且 在 本 文 中 很 常 用 定 制 的 步 骤(levels) 由 于bean 越 来 越 复 杂 属 性( 或 称 存 取 方 法) 越 来 越 多 更 多 的 属 性 出 现 在 对 话 框 里 于 是 我 们 用 来 定 制 bean 的 对 话 框 越 便 越 大 使 用 起 来 很 不 方 便 容 易 混 乱 bean 的 使 用 者 不 一 定 很 清 楚 它 的 属 性 的 意 义 以 及 它 们 之 间 的 联 系 某 些 属 性 特 别 是 索 引 属 性 在 没 有 屏 幕 时 很 不 好 理 解 另 一 些 如 果 在 图 形 状 态 下 编 辑 会 很 容 易 理 解 JavaBeans 规 范 和JavaBeans 包 解 决 了 这 个 问 题 原 因 是 它 灵 活 开 放 易 扩 展 的 规 定 分 类 和 界 面 这 就 使bean 的 开 发 者 可 以 了 解 用 户 将bean 加 入 自 己 的 程 序 中 来 定 制 它 时 的 屏 幕 显 示 当 统 一 设 计 面 板 和 让IDE 创 制 自 己 的 对 话 框 时 为 了 写 一 个 使 用 户 可 以 在 全 图 形 用 户 界 面( complete GUI) 下 自 己 配 置 的 bean 定 制 控 制 分 为 几 步(levels) 定 制 步 骤(level) 使 用 设 制 模 板 如 果 你 已 经 读 过 这 个JavaBeans 系 列 的 上 一 篇 关 于 定 制bean 的 文 章 你 已 经 知 道 存 取 方 法 可 以 改 变bean 的 内 部 状 态 你 还 会 记 得 设 制 模 板(design pattern) 是JavaSoft 用 来 表 示 存 取 方 法 的 术 语 是 根 据JavaBeans 规 范 的 命 名 规 则 定 义 的 所 以 它 们 的 程 序 包 可 以 表 示 出 所 有 的 属 性 和 设 置 方 法 如 果 你 没 有 读 过 上 述 文 章 我 来 做 一 个 小 结 属 性 是 一 个 软 件 对 象 的 内 部 状 态 的 子 集( 这 里 的 软 件 对 象 指 的 是bean) 属 性 的 存 取 方 法 提 供 了 改 变 一 个bean 的 某 个 外 部 特 性 的 唯 一 方 法JavaBeans 规 范 中 规 定 每 一 个 属 性 必 需 有 像 这 样 的 存 取 方 法 SomeType getProperty() (getter) void setProperty(SomeType value) (setter) 如 果JavaBean 遵 守JavaBeans 规 范 集 成 开 发 环 境 就 可 以 分 析 一 个bean 找 到 名 字 附 和 上 述 模 式 的 存 取 方 法 并 且 指 出 它 的 属 性 和 设 置 方 法 当IDE 知 道 属 性 的 名 字 类 型 和 存 取 方 法 后 它 立 即 可 以 生 成 一 个 定 制 对 话 框 如 果 你 对 这 段 不 是 很 理 解 可 以 参 阅 我 上 面 提 到 的 月 号 的 关 于JavaBeans 的 文 章 这 样 你 已 经 学 会 了 定 制 的 最 基 本 的 步 骤 设 制 模 板 这 是IDEs 和 其 他bean 软 件 包 提 供 给 应 用 程 序 开 发 者 定 制 一 个 bean 的 最 基 础 的 方 法 如 果 只 依 赖 于 设 制 模 板 做 为 定 制 的 界 面 存 在 着 几 个 问 题 首 先 由 于IDE 只 知 道 对 象 的 名 字 和 属 性 而 不 知 道 属 性 的 意 义 大 部 分 将 按 照 字 母 顺 序 排 列 或 按 某 种 顺 序 列 表 你 的 定 制 对 话 框 将 整 齐 但 不 实 用 对 话 框 也 会 非 常 巨 大 回 忆 一 下 我 们 在 上 几 篇 文 章 中 开 发 的BarChartBean 程 序 如 下 图 BarChartBean 和 它 的 定 制 对 话 框( 属 性 单) 这 是 一 个 简 单 漂 亮 的bean 但 请 看 一 下 它 的 属 性 表 ! 我 可 以 轻 而 易 举 地 举 出 成 打 的 很 酷 的 属 性 加 在 上 面 旋 转 立 体 效 果 色 彩 变 幻 等 等 那 么 再 设 想 一 下 用 这 个 方 法 配 置 电 子 制 表 软 件 或 字 处 理 软 件 bean 毫 不 夸 张 得 说 将 有 成 百 的 属 性 列 一 个 长 长 的 表 这 里 也 有 很 多 你 并 不 想 列 出 的 属 性 如 上 图 中 BarChartBean 右 边 的 对 话 框 里 的 几 个 属 性 象 字 体 前 景 背 景 它 们 与BarChartBean 毫 无 关 系(BarChartBean 不 使 用 文 字 并 且 总 处 于 最 大 化) 因 为 这 些 属 性 继 承 于javaawtComponent 所 以 它 们 列 在 这 里 BeanBox 尽 力 把 它 所 知 的BarChartBean 的 点 滴 列 给 你 但 它 超 过 了 你 的 要 求BarChartBean 出 现 时 我 不 需 要 所 有 这 些 属 性 它 还 会 把 你 搞 胡 涂 背 景 和 填 充 色 有 什 么 区 别 ?( 设 计 者 当 然 知 道 但 使 用 者 不 一 定 清 楚 ) 看 来 最 好 把 与 用 户 无 关 的 会 带 来 麻 烦 的 属 性 隐 藏 起 来 定 制 步 骤(level) 提 供BeanInfo 对 象 定 制 的 第 二 步javabeansBeanInfo 的 界 面 里 解 决 了 这 些 问 题BeanInfo 界 面 使 你 的bean 向 每 一 个 要 求 的 用 户 描 述 自 己( 要 求 这 个 词 我 将 在 后 面 介 绍) 除 了 显 示 属 性BeanInfo 界 面 还 可 以 显 示 名 字 图 标 属 性 列 表 方 法 事 件 等 等( 我 们 将 在 下 一 段 里 更 深 的 讨 论BeanInfo) 很 多 属 性 用 简 单 的 设 置 整 数 颜 色 或 文 件 的 方 法 不 能 很 好 的 表 示 象 是 常 见 的 枚 举 类 型 也 许 我 只 想 在 下 拉 列 中 设 几 种 色 彩( 绿 色 黄 色 等) 另 外 的 人 也 许 要 在 一 个Tabbean 中 设 置 制 表 符( 如 字 处 理 程 序 中 一 个PageLayout bean 的 子 构 件) 设 制 模 板 和 BeanInfo 不 能 直 接 控 制 这 些 情 况 而javabeansPropertyEditor 的 界 面 功 能 使 程 序 员 能 直 接 在 图 形 界 面 下 设 置 参 数 换 言 之 你 可 以 写 属 性 编 辑 器 定 制 步 骤(level) 提 供 定 制 属 性 编 辑 器 定 制 的 第 三 步javabeansPropertyEditor 和 javabeansPropertyEditorSupport 使 你 能 写 自 己 的 属 性 编 辑 器 属 性 编 辑 器 是 一 个 单 独 编 辑 具 有 一 定 类 型 的 属 性 的 构 件 当 你 击 中Color 设 置 颜 色 时 会 弹 出 BeanBox 里Color 属 性 的 标 准 编 辑 器 使 用ColorEditor 属 性 编 辑 器 你 看 到 的 这 个 对 话 框 是 BeanBox 用 来 编 辑Color 属 性 类 的 标 准 属 性 编 辑 框PropertyEditor 界 面 允 许 你 发 明 新 类 型 PropertyEditor 界 面 通 过 对 标 签(tags) 的 支 持 使 你 实 现 枚 举 类 型 某 些 属 性 由 一 个 软 件 构 件 中 的 几 个 实 际 的 属 性 组 成 可 以 认 为 是 逻 辑 属 性 逻 辑 属 性 的 一 个 最 好 的 例 子 是 彩 色 板(color balance) 它 在 一 个 面 上 显 示 各 种 色 彩 你 可 以 在 这 个 标 准 属 性 列 里 选 择 属 性 如 红 或 黄 但 不 必 在 应 用 时 列 给 用 户 显 示 色 彩 板 的 最 好 方 式 大 概 是 把 图 像 用 当 前 色 彩 显 示 在 它 周 围 用 thumbnails 表 示 变 化 用 户 可 以 选 择 最 满 意 的 图 像 对 话 框 对 这 幅 图 像 再 做 编 辑(Adobe PhotoShop 里 的 对 话 框 类 似 于 此) 定 制 步 骤(level) 提 供 定 制 器 定 制 控 制 的 第 四 步 是javabeansC |