×

关注微信公众号

免备案网站空间虚拟主机双线空间域名查询PS数码后期
photoshop互助课堂数百G视频教程下载英语培训机构初中英语如何学随时随地聆听大师开讲/课堂
路径专辑手绘教程抠图教程酷素材photoshop cs3视频教程
查看: 1182189|回复: 79

[java] 清华大学:王克宏教授讲JAVA

    [复制链接]
发表于 2006-3-2 23:15:06 | 显示全部楼层 |阅读模式
教 学 纲 要

Java 小应 用 程 序 (Java Applet) 可 以 让 WWW 上 的 起 始 页 使 用 时
感 觉 就像 一 般 的 应 用 程 序 。 而 在 应 用 程 序 中 , 窗 口 用 户 界 面 会给 人 们 带 来 无 数 的 便
利 和 帮 助 。 窗 口 用 户 界 面 使 得 程 序变 得 简 单 、 易 懂 , 程 序

美 丽 的 窗 口


使 用过 Windows 的 人 都 会 知 道 , 在 Windows 中 , 原 先 DOS 下 面
复 杂的 操 作 命 令 变 成 了 漂 亮 形 像 的 图 标 , 只 要 使 用 一 只 鼠 标就 可 以 完 成 数 百 种 不 同
的 操 作 , 许 多 在 Windows 出 现 以 前根 本 不 会 使 用 计 算 机 的 人 , 在 Windows 出 现 之 后
很 容 易 地就 在 单 位 里 为 自 己 赢 得 了 计 算 机 专 家 的 美 名。

程 序 “ 计 算 器 ” 的 窗 口 界 面


看 看上 面 这 个 计 算 器 窗 口 , 使 用 的 时 候 只 要 用 鼠 标 点 几 个 键就 可
以 了 , 就 像 使 用 一 个 真 正 的 计 算 器 那 么 方 便 , 是 不是 很 好 ? 想 不 想 创 造 属 于 自 己 的
窗 口 , 让 你 设 计 出 来 的起 始 页 具 有 与 众 不 同 的 功 能 和 表 现 方 式 ? 恐 怕 只 要 有 可能 ,
每 个 人 都 想 要 设 计 自 己 的 美 丽 窗 口 , 过 一 把 瘾 呐 。那么 , 利 用 Java 可 不 可 以 实 现 这
个 设 计 美 丽 窗 口 的 愿 望 呢?


答 案当 然 是 可 以 啦 。 Java 作 为 一 种 野 心 勃 勃 , 想 要 进 军 全 世界
, 占 领 全 球 的 计 算 机 编 程 语 言 新 星 , 是 不 会 落 在 别 人后 面 的 。


以往 用 其 他 语 言 设 计 窗 口 界 面 的 应 用 程 序 , 常
常 会 因 为 各种 窗 口 系 统 提 供 给 人 们 的 程 序 库 在 内 容 上 有 很 大 的 差 异, 导 致 人 们 在 此
窗 口 系 统 中 所 编 写 的 程 序 , 无 法 在 彼 窗口 系 统 中 正 常 运 行 。 在 Java 出 现 以 前 , 具
有 相 同 的 程 序代 码 , 却 不 能 在 不 同 的 窗 口 系 统 中 执 行 , 一 直 是 一 个 让程 序 设 计 者 头
疼 的 问 题 , 人 们 不 得 不 耐 着 性 子 一 遍 又 一遍 地 修 改 程 序 , 使 得 它 们 可 以 在 新 的 窗 口
系 统 中 执 行 。现 在 , 随 着 Java 的 出 现 , 这 个 让 人 头 疼 的 问 题 已 经 不 存在 了 。 而 且 Java
使 得 程 序 可 以 在 各 种 不 同 的 窗 口 系 统 中顺 利 地 执 行 。


它 是怎 么 做 到 这 一 点 的 呢 ? 这 是 因 为 Java 为 人 们 提 供 了 一 整套
的 窗 口 环 境 程 序 包 , 使 之 适 用 于 各 种 不 同 的 窗 口 系 统。这 个 Java 程 序 包 就 是 AWT :
Abstract Windows Toolkit ( 抽 象 窗口 程 序 包 )  





AWT 的 基 本 概 念




交 几个 新 朋 友


在 AWT 的 世 界 里 , 要 想 如 鱼 得 水 地 生 活 , 没 有 朋 友 帮 助 是 不 行的
。 所 以 首 先 就 介 绍 几 个 新 朋 友 给 大 家 认 识 :


1. 组件 ( Component )


在 窗口 系 统 中 显 示 出 来 的 各 种 对 象 都 可 以 称 为 组 件 。


像 我们 平 时 在 Windows 中 使 用 的 按 钮 ( Button ) 、 列 表 框 ( List
) 、 对 话 框 ( Dialog ) 等 等 , 都 是 组 件 的 一 种 。 每 种 组 件都 有 自 己 特 定 的 用 途 。


在 AWT 的 类 结 构 里 , 用 于 代 表 这 些 组 件 的 最 基 本 的 类 是 类 Component



2. 类 Component ( java.awt.Component )


类 Component 中 定 义 了 各 种 组 件 的 基 本 使 用 方 法 , 这 些 也 是 组
件 的 常用 方 法 。 我 们 如 果 要 对 窗 口 中 的 对 象 ( 组 件 ) 进 行 一 些基 本 操 作 , 例 如 改 变
背 景 的 颜 色 、 改 变 窗 口 对 象 的 大 小等 等 , 都 是 通 过 调 用 类 Component 中 定 义 的 方 法
来 实 现 的 。只 有 一 些 属 于 某 种 特 定 组 件 的 特 殊 用 法 不 在 类 Component 中定 义 。

[ 本帖最后由 vogue 于 2006-3-3 08:09 AM 编辑 ]
本帖的地址:http://bbs.jcwcn.com/forum.php?mod=viewthread&tid=8227
跟着教程做一遍,做完的图要到这里评论交作业,教程有看不懂的地方,可以在贴子下面评论

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-2 23:17:39 | 显示全部楼层
酷素材
第二讲 Java组件容器

教 学 纲 要


这 一部 分 的 内 容 确 实 是 复 杂 了 一 些 , 不 过 不 要 紧 , 浏 览 过 这一
部 分 之 后 , 我 们 马 上 就 有 几 个 又 生 动 又 简 单 的 小 程 序来 帮 助 你 学 习。 实 践 出 真
知 ” , 你 很 快 就 会 学 会 的 , 不要 太 着 急 嘛 !?/font>





3. 组件 容 器 ( Container)


组 件容 器 是 一 种 比 较 特 殊 的 组 件 , 它 可 以 包 含 其 他 的 组 件 。我 们 可 以 把 组
件 放 在 组 件 容 器 中 。 反 之 , 如 果 一 个 组 件不 是 组 件 容 器 , 则 其 中 不 能 包 含 其
他 的 组 件 。
组 件 容 器 也 是 一 种 组 件 , 所 以 一 个 组 件 容 器 可 以 放 在 另一 个 组 件 容 器 中 。


> 组 件容 器 的 出 现 使 得 事 情 变 得 复 杂 了 起 来 。 我 们 可 以 把 组 件放 在 组 件 容 器
里 , 也 可 以 把 组 件 容 器 放 在 另 一 个 组 件 容器 里 , 这 样 就 形 成 了 有 层 次 的 组 件
结 构 。 我 们 可 以 把 普通 的 组 件 想 像 成 为 鸡 蛋 , 而 把 组 件 容 器 想 像 成 为 篮 子 。那
么 , 鸡 蛋 可 以 放 在 小 篮 子 里 , 小 篮 子 和 别 的 鸡 蛋 又 可以 放 在 大 篮 子 里 。 于 是
, 篮 子 里 可 以 有 鸡 蛋 , 还 可 以 有其 他 的 篮 子 … 也 许 事 情 会 变 得 像 下 面 这 样 :





  


父 亲、 儿 子 和 孙 子


在 AWT 这 个 大 家 族 里 , 有 着 复 杂 的 继 承 关 系 , 怎 么 可 以 不 搞 清楚 ?

先 看 看 一 部 分 家 族 的 继 承 关 系 表 吧 :


从 下面 家 谱 可 以 看 出 AWT 中 的 类 实 在 是 家 族 昌 盛 , 父 生 子 、 子生 孙 、 孙 又
生 子 , 子 子 孙 孙 , 颇 有 些 繁 荣 哩 。





图 13.2 AWT 的 类 层 次  



呀 ! 怎 么 我 看 到 在 这 个 大 家 族 的 成 员 里 面 有 类 Applet ( 小应 用 程 序 ) ? 难
道 我 们 编 写 的 用 ?www 浏 览 器 上 的 小 应 用程 序 都 是 源 于 这 里 吗 ?


当 我们 编 写 小 应 用 程 序 的 时 候 , 程 序 的 结 构 总 是 这 样 的 :


public class 程 序 名 extends java.applet.Applet { }


这 样一 来 , 我 们 就 把 applet 程 序 和 AWT 的 窗 口 环 境 结 合 在 一 起了 。 ( 是 不
是 觉 得 AWT 一 下 子 身 价 倍 增 ? )  


  类 Container 的 重 要 子 孙


所 有可 以 用 作 组 件 容 器 的 窗 口 对 象 , 都 是 由 类 Container 或 者 类 Container
的 子 孙 类 生 成 的 。 类 Container 的 子 孙 个 个 都 是 画窗 口 的 好 手 , 各 怀 绝 技 在
身 , 实 在 是 值 得 为 它 们 多 费 点笔 墨 的 。


1. 类 Window : 类 Container 的 子 类 , 是 画 窗 口 最 基 本 的 类 。

2. 类 Dialog : 类 Window 的 子 类 , 用 于 生 成 各 种 对 话 框 。

3. 类 FileDialog : 继 承 类 Dialog 的 类 , 可 以 用 来 生 成 文 件 对 话 框。 ( 文
件 对 话 框 用 来 让 用 户 选 择 和 输 入 文 件 名 ) 。

4. 类 Frame : 类 Window 的 子 类 , 用 来 设 计 具 有 一 般 窗 口 标 准 和 菜单 系 统 的
窗 口 。

5. 类 Panel : 类 Container 的 子 类 , 是 类 Applet 的 父 类 ; 类 Panel 在小 应
用 程 序 中 不 可 缺 少 , 它 所 定 义 的 窗 口 对 象 是 一 块 简单 的 区 域 , 这 块 区 域 用 来
放 置 各 种 有 用 的 窗 口 对 象 。



Panel 和 普 通 的 Window 相 似 之 处 是 可 以 把 许 多 相 关 的 窗 口 对象 放 在 同 一 个
Panel 中 ; Panel 和 Window 不 同 之 处 在 于 我 们 可以 方 便 地 使 用 Panel 来 安
排 一 组 一 组 的 窗 口 对 象 , 而 不 必为 安 排 每 一 个 窗 口 对 象 而 发 愁 。


当 小应 用 程 序 在 WWW 浏 览 器 中 执 行 的 时 候 , 浏 览 器 会 自 动 地 为它 准 备 一 个
Panel , 然 后 程 序 中 有 关 窗 口 的 操 作 都 会 在 这个 Panel 上 进 行 。



这 一 部 分 的 内 容 似 乎 都 是 些 新 鲜 的 概 念 , 而 且 技 术 性 很强 , 真 有 点 儿 难 懂 呀



这 一部 分 的 内 容 确 实 是 复 杂 了 一 些 , 不 过 不 要 紧 , 浏 览 过 这一 部 分 之 后 ,
我 们 马 上 就 有 几 个 又 生 动 又 简 单 的 小 程 序来 帮 助 你 学 习 , 你 自 己 动 手 在 计 算
机 上 照 猫 画 虎 一 般 地编 写 运 行 以 下 的 程 序 , 一 边 玩 程 序 一 边 回 过 头 来 学 习 这里
讲 的 概 念 和 知 识 , “ 实 践 出 真 知 ” , 你 很 快 就 会 学 会的 , 不 要 太 着 急 嘛 !

[ 本帖最后由 vogue 于 2006-3-3 08:07 AM 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-2 23:19:28 | 显示全部楼层
第三讲 窗口设计(一)

教 学 纲 要

从 简单 的 例 子 开 始 学 起 。  





窗 口设 计 实 例


白 手起 家

没 有在 窗 口 环 境 下 编 写 过 程 序 的 人 们 , 现 在 就 是 白 手 起 家 ,建 设 大 厦 的 时 候
了 , 打 起 精 神 来 呀 。

白 手起 家 就 先 做 一 个 最 简 单 的 吧 , 就 像 达 · 芬 奇 学 画 画 也 要从 画 鸡 蛋 开 始 一
样 , 学 着 编 写 窗 口 环 境 下 的 程 序 也 要 从最 简 单 的 学 起 。 这 个 简 单 的 程 序 就 是
: 显 示 简 单 一 句 话: “ 这 是 白 手 起 家 制 造 的 第 一 个 窗 口 程 序 ” ( 见 图 13.3
) 。







图 13.3 第 一 个 窗 口 程 序




制 造出 图 13.3 效 果 的 Java 程 序 是 这 样 的 :

程 序 13.1

import java.awt.Label;

        // 由 于 在 这 个 程 序 中 将 使 用 类 Label , 所 以 要 先 把 它 import 进


public class window1 extends java.applet.Applet

        // Applet 程 序 类 window1

    {

public void init( ) {

    resize(220,100);    // 设 置 此 小 应 用程 序 的 窗 口 大 小

    add(new Label(" 这 是 白 手 起 家 制 造 的 第一 个 窗 口 程 序 "));
// 在 窗 口 内 写 一 句 话

}

    }

观 察 研 究 这 个 程 序 就 会 发 现 里 面 其 实 只 有两 条 主 要 语 句 , 一 个 是 resize 语
句 , 用 来 设 定 这 个 小 应 用程 序 的 尺 寸 大 小 。 实 际 上 , 我 在 运 行 这 个 小 应 用 程
序 时, 是 把 它 嵌 在 如 下 的  文 件 中 的 :





这 个  文 件 中 规 定 此 Applet 以 400 × 100 的 尺 寸 运 行 , 而 实 际 最 后显
示 出 的 运 行 结 果 是 220 × 100 大 小 的 。 这 就 是 执 行 了 Applet 程 序 中 resize(220,100)
这 条 语 句 的 结 果 语 句

add(new Label(" 这 是 白 手 起 家 制 造 的 第 一 个 窗口 程 序 "));

负 责 在 这 个 小 应 用 程 序 加 入 一 句 话 。 这 条语 句 中 用 到 了 类 Label , Label 是
用 来 显 示 一 个 单 行 的 字 符串 的 类 。

使 用 new Label( 字 符 串 ) 可 以 生 成 一 个 可 在 窗 口 中 显 示 的 标 号, 其 内 容 等
于 字 符 串 的 内 容 。



--------------------------------------------------------------------------------


类 Label 的 生 成 方 式 是 : 名 字 = new Label ( 参 数 1 , 参 数 2 ) ; 规 则 :

1. 名 字 是 随 便 起 的 。

2. 参 数 1 可 以 是 任 何 一 个 字 符 串 对 象 。

3. 参 数 2 用 于 设 置 对 齐 方 式 , 共 有 三 种 对齐 方 式 :


  

* 向 右 边 对 齐 : Label.RIGHT

* 向 左 边 对 齐 : Label.LEFT

* 向 中 间 对 齐 : Label.CENTER


4. 可 以 只 给 出 参 数 1 或 不 给 出 任 何 参 数 :

new Label( ) 将 生 成 一 个 空 的 标 号 ( Label )

new Label( 参 数 1) 将 生 成 一 个 向 左 边 对 齐 的标 号 。

按 照 上 面 的 规 则 可 以 生 成 你 所 需 要 的 标 号。

--------------------------------------------------------------------------------


参 数 字 符 串 可 以 是 中 文 吗 ? 从 上 面 的 程 序 我 们 已 经 得 到肯 定 的 答 案 了 。 事 实 上
, 根 据 Java 的 规 定 , Label 以 及 后面 要 讲 述 的 其 他 类 的 参 数 字 符 串 可 以 用 世
界 上 任 何 一 种国 家 的 文 字 来 写 。






教 学 纲 要

从 简单 的 例 子 开 始 学 起 。  





窗 口设 计 实 例


白 手起 家

没 有在 窗 口 环 境 下 编 写 过 程 序 的 人 们 , 现 在 就 是 白 手 起 家 ,建 设 大 厦 的 时 候
了 , 打 起 精 神 来 呀 。

白 手起 家 就 先 做 一 个 最 简 单 的 吧 , 就 像 达 · 芬 奇 学 画 画 也 要从 画 鸡 蛋 开 始 一
样 , 学 着 编 写 窗 口 环 境 下 的 程 序 也 要 从最 简 单 的 学 起 。 这 个 简 单 的 程 序 就 是
: 显 示 简 单 一 句 话: “ 这 是 白 手 起 家 制 造 的 第 一 个 窗 口 程 序 ” ( 见 图 13.3
) 。







图 13.3 第 一 个 窗 口 程 序




制 造出 图 13.3 效 果 的 Java 程 序 是 这 样 的 :

程 序 13.1

import java.awt.Label;

        // 由 于 在 这 个 程 序 中 将 使 用 类 Label , 所 以 要 先 把 它 import 进


public class window1 extends java.applet.Applet

        // Applet 程 序 类 window1

    {

public void init( ) {

    resize(220,100);    // 设 置 此 小 应 用程 序 的 窗 口 大 小

    add(new Label(" 这 是 白 手 起 家 制 造 的 第一 个 窗 口 程 序 "));
// 在 窗 口 内 写 一 句 话

}

    }

观 察 研 究 这 个 程 序 就 会 发 现 里 面 其 实 只 有两 条 主 要 语 句 , 一 个 是 resize 语
句 , 用 来 设 定 这 个 小 应 用程 序 的 尺 寸 大 小 。 实 际 上 , 我 在 运 行 这 个 小 应 用 程
序 时, 是 把 它 嵌 在 如 下 的  文 件 中 的 :





这 个  文 件 中 规 定 此 Applet 以 400 × 100 的 尺 寸 运 行 , 而 实 际 最 后显
示 出 的 运 行 结 果 是 220 × 100 大 小 的 。 这 就 是 执 行 了 Applet 程 序 中 resize(220,100)
这 条 语 句 的 结 果 语 句

add(new Label(" 这 是 白 手 起 家 制 造 的 第 一 个 窗口 程 序 "));

负 责 在 这 个 小 应 用 程 序 加 入 一 句 话 。 这 条语 句 中 用 到 了 类 Label , Label 是
用 来 显 示 一 个 单 行 的 字 符串 的 类 。

使 用 new Label( 字 符 串 ) 可 以 生 成 一 个 可 在 窗 口 中 显 示 的 标 号, 其 内 容 等
于 字 符 串 的 内 容 。



--------------------------------------------------------------------------------


类 Label 的 生 成 方 式 是 : 名 字 = new Label ( 参 数 1 , 参 数 2 ) ; 规 则 :

1. 名 字 是 随 便 起 的 。

2. 参 数 1 可 以 是 任 何 一 个 字 符 串 对 象 。

3. 参 数 2 用 于 设 置 对 齐 方 式 , 共 有 三 种 对齐 方 式 :


  

* 向 右 边 对 齐 : Label.RIGHT

* 向 左 边 对 齐 : Label.LEFT

* 向 中 间 对 齐 : Label.CENTER


4. 可 以 只 给 出 参 数 1 或 不 给 出 任 何 参 数 :

new Label( ) 将 生 成 一 个 空 的 标 号 ( Label )

new Label( 参 数 1) 将 生 成 一 个 向 左 边 对 齐 的标 号 。

按 照 上 面 的 规 则 可 以 生 成 你 所 需 要 的 标 号。

--------------------------------------------------------------------------------


参 数 字 符 串 可 以 是 中 文 吗 ? 从 上 面 的 程 序 我 们 已 经 得 到肯 定 的 答 案 了 。 事 实 上
, 根 据 Java 的 规 定 , Label 以 及 后面 要 讲 述 的 其 他 类 的 参 数 字 符 串 可 以 用 世

[ 本帖最后由 vogue 于 2006-3-3 08:06 AM 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 07:59:59 | 显示全部楼层
第四讲 窗口设计(二)
教 学 纲 要


上 一次 已 经 创 建 了 第 一 个 窗 口 程 序 , 这 次 再 前 进 一 小 步
。  





前 进一 小 步


从 零开 始 , 创 建 了 第 一 个 窗 口 程 序 , 是 不 是 有 吃 了 第 一
只 螃蟹 的 感 觉 , 或 者 是 觉 得 没 什 么 难 的 ? 下 面 我 们 就 开 始 向前 进 , 改 进 一 下
程 序 。

图 13.5 程 序 13.2 的 执 行 结 果 ( 2 )

图 13.4 是 改 进 后 的 程 序 窗 口 , 当 我 们 用 鼠 标 单 击 “ 增
加 一 句 话 ” 这 个 按 钮 以 后 , 窗 口 就 变 成 了 图 13.5 的 样 子 了 。 如 果再 用 鼠 标
单 击 这 个 按 钮 , 每 单 击 一 次 , 窗 口 里 就 会 添 加一 句 话 : “ 这 是 白 手 起 家 制 造
的 第 一 个 窗 口 程 序 ” 。


程 序 13.2

import java.awt.*;

// 通配 符 * 表 示 把 所 有 前 9 个 字 符 为 “ java.awt. ” 的
类 都 import 进 来

public class window2 extends java.applet.Applet

{

public void init( ) {

resize(220,100);

add(new Label(String.valueOf(" 这 是 白 手 起 家
制 造 的 第 一 个 窗 口 程 序 ")));

add (new Button(" 增 加 一 句 话 "));

}

public boolean action(Event evnt,Object Buttonname)

{

if (evnt.target instanceof Button)

{

add(new Label(" 这 是 白 手 起 家 制 造 的 第 一 个 窗
口 程 序 "));

layout( );

return true;

}

else

return false;

}

}


观 察程 序 13.2 , 可 以 看 到 里 面 除 了 用 到 类 Label 以 外
, 还 用 到了 类 Botton 和 类 Event 。 所 以 , 我 们 先 来 看 一 看 这 两 个 类 的用 法 :





* 类 Button


类 Button 是 用 来 制 造 按 钮 的 。 在 90% 的 窗 口 程 序 中 使
用 了 按 钮 来 完成 各 种 各 样 的 功 能 , 例 如 我 们 所 熟 悉 的 “ 确 定 ” ( OK )、 “ 取
消 ” ( CANCEL ) 按 钮 等 等 。

使 用 new Button( 字 符 串 ) 可 以 生 成 一 个 新 的 按 钮 , 按
钮 上 显 示的 就 是 字 符 串 的 内 容 。 例 如 :

使 用 new Button( “ 确 定 ” ) 就 可 以 生 成 一 个使 用 new Button( “ CANCEL ” ) 则 可 生 成 一 个 如 果 不 加 参 数 , 即 使 用 new Button( ) ; 则会 生
成 像 这 样 一 个 空 的 、 上 面 没 有 任 何 显 示 的 按 钮 。

* 类 Event


许 多的 组 件 都 会 产 生 事 件 ( event ) 。 例 如 , 当 我 们 用
鼠 标 击中 一 个 按 钮 的 时 候 , 就 会 有 一 个 事 件 ACTION_EVENT 发 生 。 事件 ACTION_EVENT
就 是 用 来 表 示 组 件 所 产 生 的 事 件 。 事 件 ACTION_EVENT 有 一 个 处 理 程 序 , 每
当 事 件 ACTION_EVENT 发 生 以 后 , 就 会 自动 调 用 这 个 处 理 程 序 来 处 理 事 件 。


处 理事 件 ACTION_EVENT 的 处 理 程 序 就 是 方 法 action
 楼主| 发表于 2006-3-3 08:03:07 | 显示全部楼层
酷素材
第五讲 窗口设计(三)

教 学 纲 要

在 复杂 的 窗 口 结 构 里 , 事 件 发 生 以 后 , 该 由 谁 来 处 理 呢

_________________________________

我 们 使 用 组 件 和 组 件 容 器 的 概 念 来 设 计 程 序 , 使 得 窗 口程 序 的 结 构 变 得 很 复
杂 , 有 很 多 的 层 次 。 很 可 能 设 计 出这 样 的 程 序 : 一 个 组 件 容 器 里 保 护 了 几 个
组 件 和 几 个 组件 容 器 , 而 这 些 组 件 容 器 有 的 包 含 一 些 组 件 , 有 的 又 包含 了 几
个 组 件 和 几 个 组 件 容 器 , 层 层 相 套 , 好 像 如 下 的形 式 :  


( 图中 圆 圈 表 示 组 件 容 器 , 方 框 表 示 组 件 。 )


那 么, 在 如 此 复 杂 的 窗 口 结 构 里 , 事 件 发 生 以 后 , 该 由
谁 来处 理 呢 ?


原 来, 当 事 件 发 生 的 时 候 , 会 首 先 交 给 最 内 层 的 窗 口 对
象 来处 理 。 如 果 该 窗 口 对 象 的 事 件 处 理 程 序 的 返 回 值 是 false 的 话 , 那 么 这
个 事 件 就 会 被 传 递 给 包 含 该 窗 口 对 象 的 组件 容 器 来 处 理 , 这 样 一 级 一 级 地 往
上 传 递 。 直 到 有 一 个窗 口 对 象 的 事 件 处 理 程 序 返 回 值 为 true 为 止 。


所 以, 在 我 们 自 己 所 写 的 事 件 处 理 程 序 当 中 , 如 果 处 理
了 某个 事 件 , 则 应 置 返 回 值 为 true , 如 果 没 有 处 理 , 则 应 设置 返 回 值 为 false
, 以 便 将 事 件 传 递 到 上 一 级 去 。


所 有由 组 件 发 出 的 事 件 , 像 由 输 入 设 备 发 出 的 事 件 一 样
, 都会 交 给 方 法 handleEvent 去 处 理 , 而 在 原 来 的 方 法 handleEvent 中 , 又
会 转 而 调 用 方 法 action 来 处 理 这 些 由 组 件 发 出 的 事件 。


因 此, 通 常 的 情 况 下 , 我 们 会 自 己 写 一 段 方 法 action
程 序 来 处理 组 件 发 出 的 事 件 。



--------------------------------------------------------------------------------


方 法 action 的 用 法 如 下 所 示 :


public boolean action( 参 数 1 , 参 数 2 )

{

… …

}


方 法的




返 回 值 是 一 个 布 尔 型 的 变 量 ,

第 一 个 参 数 是 一 个 事 件

第 二 个 参 数 是 用 来 放 置 额 外 的 数 据 用 的 。 例如 , 如 果
是 一 个 按 钮 发 生 了 ACTION_EVENT 事 件 , 则 这 第 二 个参 数 所 置 的 值 就 是 被
按 下 的 按 钮 上 所 显 示 的 字 符 串 。



方 法 action 被 调 用 时 , 可 能 是 任 何 一 个 组 件 发 生 了 ACTION_EVENT
事 件 , 所 以 在 方 法 action 的 一 开 始 应 先 检 查 是 哪 一 个 组 件发 生 了 事 件 , 如
果 不 是 我 们 所 关 心 的 那 个 组 件 发 生 了 事件 , 就 不 去 理 睬 它 。


程 序流 程 分 析 :

1. 在这 个 程 序 里 使 用 了 类 Label 、 类 Botton 和 类 Event
, 为 了 书 写简 便 使 用 了 通 配 符 * , 表 示 把 所 有 前 9 个 字 符 为 “ java.awt. ”
的 类 import 进 来 。

2. 构造 Applet 程 序 类 window1 。

3. 写初 始 化 程 序 :




( 1 ) 设 定 窗 口 大 小 ;

( 2 ) 在 窗 口 以 内 加 入 一 句 话 和 一 个 按 钮 。





4. 写 事 件 处 理 程 序 :




( 1 ) 判 断 是 否 是 按 钮 发 生 的 事 件 ;

( 2 ) 如 果 是 按 钮 发 生 的 事 件 , 则 :

在 窗 口 中 加 入 一 句 话 , 执 行 语 句 layout( ) , 并且 设
定 返 回 值 为 true 。

( 3 ) 如 果 不 是 按 钮 发 生 的 事 件 则 置 返 回 值 为 false
, 然 后 返 回 。



--------------------------------------------------------------------------------


在 这 个 程 序 里 面 出 现 的 layout( ) 是 怎 么 一 回 事 ? 如 果 我 们把 layout( ) 语 句
从 程 序 中 删 除 , 则 会 发 生 这 样 的 情 况 : 当程 序 运 行 后 , 如 果 我 们 用 鼠 标 单 击 按
钮 “ 增 加 一 句 话 ” , 屏 幕 显 示 丝 毫 不 会 发 生 变 化 。 那 么 , 是 不 是 说 明 按 钮不 起
作 用 了 呢 ? 不 是 。 如 果 我 们 用 鼠 标 点 在 窗 口 的 边 框线 上 移 动 窗 口 的 边 线 , 改 变
一 下 窗 口 的 大 小 ( 当 鼠 标 变成 黑 色 实 心 双 箭 头 时 , 按 下 鼠 标 左 键 , 做 拖 曳 鼠 标
的 动作 ) , 就 会 发 现 新 增 加 的 话 显 示 了 出 来 。 那 么 , layout( ) 语 句 是 做 什 么
的 , 它 是 如 何 让 新 的 Label 自 动 地 增 加 到窗 口 中 去 的 呢 ? 请 看 下 章 : 《 巧 手 木
匠 》

--------------------------------------------------------------------------------

小 结
在 这 一 章 里 , 我 们 学 习 了 众 多 的 有 关 窗 口 的 概 念 , 新 朋友 新 面 孔 可 真 不 少 , 一
定 要 反 复 复 习 呀 !



类 Container 是 窗 口 编 程 的 不 可 缺 少 的 概 念 。

类 Button 和 类 Label 是 最 基 本 的 窗 口 组 件 。

在 这 一 章 里 的 新 学 的 类 有 :

Component 、 Container 、 Panel 、 Window 、 Frame
、 Dialog 、 FileDialog 、 Button 和 Label 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:18:09 | 显示全部楼层

第六讲 窗口工具(一)

酷素材
教 学 纲 要


介 绍做 窗 户 的 巧 手 木 匠 一 族 。
————————————————————————————
类 FlowLayout 用 类 FlowLayout 生 成 的 外 观 管 理 器 是
AWT 为 类 Panel 所 设 计 的外 观 管 理 器 。 它 是 我 们 所 使 用 的 默 认 的 外 观 管 理 器

默 认 的 外 观 管 理 器 ” 的
意 思 就 是 说 当 我 们 没 有 在程 序 之 中 使 用 其 他 的 外 观 管 理 器 ( 如 CardLayout
、 等 ) 的时 候 , Java 就 自 动 地 使 用 FlowLayout 外 观 管 理 器 进 行 一 系 列的 外
观 管 理 工 作 。 像 我 们 前 面 的 程 序 13.1 ( 白 手 起 家 程序 ) 就 是 使 用 的 FlowLayout
来 进 行 外 观 管 理 的 。


从 程序 13.1 我 们 应 该 已 经 看 出 来 了 , FlowLayout 外 观
管 理 器 所 做的 就 是 把 程 序 之 中 的 各 个 组 件 对 象 按 照 先 后 顺 序 依 次 排开 , 从 左
到 右 , 从 上 到 下 , 依 次 地 排 。


又 例如 :


程 序 14.3


   
  1. import java.awt.*;

  2.     public class window5 extends java.applet.Applet

  3.     {

  4.       public void init( ) {

  5.         resize(150,60);

  6.         setLayout(new FlowLayout( )); // 使 用 FlowLayout
  7. 外 观 管 理 器

  8.         add("East",new Button(" 东
  9. 边 "));

  10.         add("West",new Button(" 西
  11. 边 "));

  12.         add("South",new Button("
  13. 南 边 "));

  14.         add("North",new Button("
  15. 北 边 "));

  16.         add("Center",new Button("
  17. 中 央 "));

  18.                     }

  19.     }
复制代码



程 序 14.3 的 运 行 结 果 如 图 14.4 所 示 :

[论坛提醒图见附件]
图 14.4 程 序 14.3 的 执 行 结 果


实 际上 , 如 果 我 们 把 程 序 中 的 setLayout (new FlowLayout(
)); 这 条 语句 去 掉 , 程 序 的 执 行 结 果 也 是 一 样 的 , 没 有 任 何 区 别 。这 是 因 为
FlowLayout 外 观 管 理 器 是 默 认 的 外 观 管 理 器 的 缘故 。 有 兴 趣 的 人 可 以 自 己
试 一 试 。 如 果 我 们 改 变 语 句

        resize(150,60);

为 :

        resize(300,60);


则 程序 运 行 结 果 如 图 14.5 :

图见附件

图 14.5 改 变 后 的 程 序 14.3 的 执 行 结 果


我 们从 以 上 的 程 序 运 行 结 果 可 以 进 一 步 看 出 , 当 窗 口 之
中 的组 件 不 能 排 满 一 排 的 时 候 , 组 件 是 按 照 向 中 间 对 齐 的 原则 来 排 列 的 。
height="80"> 向 中 间 对 齐 是 默 认 的 对 齐 规 则 。


对 齐方 式 是 可 以 改 变 的 :




使 用 FlowLayout.LEFT 可 以 使 得 组 件 们 向 左 边 对 齐

使 用 FlowLayout.RIGHT 可 以 使 得 组 件 们 向 右 边 对 齐

使 用 FlowLayout.CENTER 可 以 使 得 组 件 们 向 中 间 对齐
( 也 就 是 默 认 的 对 齐 方 式 )

我 们把 上 面 语 句 之 中 的 setLayout(new FlowLayout(
)); 改 为 :

        setLayout(new FlowLayout(FlowLayout.LEFT));


程 序运 行 结 果 就 会 如 下 所 示 ( 图 14.6 ) :

[图见附件]
图 14.6 进 一 步 改 变 后 的 程 序 14.3 的 执 行 结 果

那 么 , 使 用 了 语 句 setLayout(new FlowLayout(FlowLayout.RIGHT));
以 后 , 窗 口 会 变 成 什 么 样 子 呢 ? 这 个 问 题 留 着 大 家 自 己编 个 程 序 试 一 试
吧 。 好 吗 ?


类 GridLayout


英 文里 面 Grid 有 “ 网 格 ” 的 意 思 , GridLayout 外
观 管 理 器 也 有 这方 面 的 意 义 。 GridLayout 外 观 管 理 器 会 把 窗 口 分 成 许
多 大小 相 等 的 均 匀 网 格 , 然 后 再 一 个 格 、 一 个 格 地 往 里 放 组件 。


既 然是 分 成 许 多 格 , 就 有 一 个 怎 么 分 的 问 题 , 到 底
分 成 多 少块 、 几 行 几 列 呢 ? 这 些 问 题 都 由 程 序 设 计 者 在 调 用 GridLayout
的 时 候 来 决 定 。 方 法 如 下 :

        GridLayout ( 行 数 , 列 数 )


程 序 14.4

   
  1. import java.awt.*;

  2.     public class window6 extends java.applet.Applet

  3.     {

  4.       public void init( ) {

  5.         resize(300,100);

  6.         setLayout(new GridLayout(2,3)); // 分
  7. 为 2 行 3 列

  8.         add("East",new Button("
  9. 东 边 "));

  10.         add("West",new Button("
  11. 西 边 "));

  12.         add("South",new Button("
  13. 南 边 "));

  14.         add("North",new Button("
  15. 北 边 "));

  16.         add("Center",new Button("
  17. 中 央 "));

  18.                     }

  19.     }
复制代码

运 行 结 果 如 图 14.7 :
[见附件]

如 果 所 设 置 的 网 格 数 目 比 组 件 数 目 少 , 会 怎 么 样 呢 ?比
如 上 面 的 程 序 , 如 果 设 置 为 2 行 2 列 , 程 序 的 执 行 结 果会 是 什 么 样 呢 ?

专 家 : 这 个 问 题 问 得 很 好 , 你 可 以 自 己 改写 一 下 上 面
的 程 序 , 看 一 看 运 行 结 果 是 什 么 样 的 。 多 学多 练 , 举 一 反 三 是 学 习 的 重
要 方 法 。

[ 本帖最后由 vogue 于 2006-3-3 08:31 AM 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:25:26 | 显示全部楼层

第八讲 外观管理器之gridbaglayout

教 学 纲 要


讲 外观 管 理 器 如 果 不 讲 GridBagLayout 外 观 管 理 器 就 好
像 讲 《 岳飞 传 》 不 讲 岳 母 刺 字 一 样 , 最 精 彩 的 部 分 没 有 讲 。虽 说 GridBagLayout
和 GridLayout 只 有 一 点 差 别 , 它 的 作 用 却 是 出 奇的 大 。  
——————————————————————

类 GridBagLayout


讲 外观 管 理 器 如 果 不 讲 GridBagLayout 外 观 管 理 器 就 好
像 讲 《 岳飞 传 》 不 讲 岳 母 刺 字 一 样 , 最 精 彩 的 部 分 没 有 讲 。


虽 说 GridBagLayout 和 GridLayout 只 有 一 点 差 别 , 它
的 作 用 却 是 出 奇的 大 。 这 是 因 为 GridBagLayout 一 改 其 他 的 外 观 管 理 器 的 死板
模 样 , 具 有 很 多 的 灵 活 性 。 它 不 再 像 其 他 的 外 观 管 理器 那 样 , 使 得 各 个 组 件
的 大 小 都 一 样 。 GridBagLayout 通 过类 GridBagConstraints 的 帮 助 , 按 照
设 计 的 意 图 , 改 变 组 件 的大 小 , 把 它 们 摆 在 设 计 者 希 望 摆 放 的 位 置 上 。


在 GridBagLayout 中 , 每 个 组 件 都 有 一 个 GridBagConstraints
对 象 来 给 出 它 的 大小 和 摆 放 位 置 。 我 们 在 使 用 GridBagLayout 的 时 候 , 最 重
要的 就 是 学 会 使 用 这 个 类 GridBagConstraints 的 使 用 方 法 , 学 会如 何 设 置 组
件 的 大 小 、 位 置 等 限 制 条 件 。


我 们先 看 一 个 用 GridBagLayout 外 观 管 理 器 生 成 的 窗 口
( 图 14.8 ):

图 14.8 程 序 14.5 的 执 行 结 果


这 个窗 口 里 面 的 几 个 按 钮 有 的 大 、 有 的 小 , 其 大 小 、 位
置 均不 同 , 没 有 一 定 的 规 律 可 循 , 这 即 是 发 挥 了 GridBagLayout 外 观 管 理 器
的 灵 活 性 。 生 成 此 窗 口 的 程 序 为 :

程 序 14.5

    import java.awt.*;

            // 输 入 所 有 的 java.awt 类

    public class window7 extends java.applet.Applet

    {

      public void init( ) {

        resize(300,100); // 设 置 窗 口 的 大 小

        GridBagConstraints gbc = new GridBagConstraints(
); // 使 用 类 GridBagConstriants

        setLayout(new GridBagLayout()); //设 定 外观
管 理 器 为 GridBagLayout 外 观 管 理 器

        gbc.fill = GridBagConstraints.BOTH; // ★
所 有 的 按 钮 都 会 把 分 配 的 剩 余 空 间 填 满

        gbc.gridwidth = 1; // ★ 设 置 第 一 个 按钮 的 大


        gbc.gridheight = 1; // ★

        Button Button1 = new Button(" 东 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button1,gbc);

        add(Button1);

        gbc.gridwidth = GridBagConstraints.REMAINDER;
// ★ 第 二 个 按 钮 填 满 整 行 空 间

        Button Button2 = new Button(" 西 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button2,gbc);

        add(Button2);

        gbc.gridheight = 4; // 设 置 第 三 个 按钮 的 大


        gbc.gridwidth = 1;

        Button Button3 = new Button(" 南 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button3,gbc);

        add(Button3);

        gbc.gridheight = 2; // 设 置 第 四 个 按钮 的 大


        gbc.gridwidth = 2; // GridBagConstraints.REMAINDER;

        Button Button4 = new Button(" 北 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button4,gbc);

        add(Button4);

        gbc.gridwidth = GridBagConstraints.REMAINDER;

        Button Button5 = new Button(" 中 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button5,gbc);

        add(Button5);

        gbc.insets = new Insets(5,6,7,8); // ★ 设置
第 五 个 按 钮 的 位 置

        Button Button6 = new Button(" 好 酒 在
张弓 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button6,gbc);

        add(Button6);

                    }

    }

    ★ 注 释 : 程 序 14.5 里 面 有 星 号 的 语 句都 将 做 详 细 的
解 释


下 面就 详 细 地 解 释 一 下 程 序 14.5 , 通 过 对 这 个 小 程 序
的 分 析可 以 从 中 了 解 GridBagLayout 外 观 管 理 器 的 工 作 原 理 和 工 作方 法 。



    GridBagLayout 外 观 管 理 器 实 际 上 是 根 据 类 GridBagConstraints 所 给
出 的 条 件 限 制 以 及 组 件 本 身 的 一 向 特 性 条 件 ( 例 如每 个 组 件 程 序 允 许 的 最 小
尺 寸 ) , 来 决 定 各 个 组 件 的 外观 的 。


让 我们 把 程 序 14.5 之 中 出 现 的 新 鲜 的 语 句 一 条 一 条 地
看 个 明白 吧 :


1. gbc.fill = GridBagConstraints.BOTH;


每 个组 件 有 一 定 的 原 始 大 小 , 例 如 在 类 FlowLayout 外
观 管 理 器的 管 理 之 下 显 示 的 就 都 是 组 件 的 本 身 原 始 大 小 。 如 果 我们 分 配 给 一
个 组 件 的 空 间 比 它 原 本 所 需 要 的 空 间 大 时 ,就 需 要 一 定 的 方 式 方 法 来 决 定 如
何 处 理 这 一 部 分 多 余 的空 间 。 这 时 就 用 到 了 fill 值 。 Java 根 据 人 们 给 这 个
fill 设定 的 值 来 决 定 如 何 处 理 比 组 件 原 始 空 间 大 的 那 部 分 空 间。



 fill 可 以 取 四 种 不 同 的 值 , 它 们 分 别 代 表 了 四 种 不 同
的 剩 余空 间 处 理 方 式 :


GridBagConstraints.NONE

    不 必 理 睬 剩 余 空 间 的 存 在 , 让 它 空 着好 了 。

GridBagConstraints.BOTH

    不 让 一 点 剩 余 空 间 存 在 , 改 变 组 件 的大 小 , 让 它 填
满 分 配 给 它 的 整 个 空 间 。

GridBagConstraints.HORIZONTAL

    调 整 组 件 的 大 小 , 把 水 平 方 向 的 空 间填 满 。

GridBagConstraints.VERTICAL

    调 整 组 件 的 大 小 , 把 垂 直 方 向 的 空 间填 满 , 让 水 平
方 向 的 空 间 空 着 吧 。


2. gbc.gridwidth = 1; 和 gbc.gridheight = 1;

这 两句 话 像 是 一 对 孪 生 兄 弟 , 应 该 同 时 给 以 同 样 的 重 视
。 它们 一 个 负 责 组 件 的 水 平 宽 度 ( gridwidth ) , 一 个 负 责 组 件的 垂 直 高 度
( gridheight ) 。 由 此 我 们 可 以 知 道 , 组 件 的大 小 是 可 以 变 化 的 。



组 件 的 形 状 是 不 能 改 变 的 , 永 远 是 矩 形 的 。


   好 了 , 这 两 条 语 句 的 意 义 很 简 单 , 就 讲 到 这 里 吧 。

    喂 ! 等 一 等 , 我 看 到 下 面 有 一 条 语 句是 :

        gbc.gridwidth = GridBagConstraints.REMAINDER;

这 是 什 么 意 思 ?


怎 么 gridwidth 的 值 不 是 一 个 数 , 而 是 “ GridBagConstraints.REMAINDER
” ?


原 来, 这 是 Java 精 心 为 大 家 设 计 的 一 个 特 别 有 用 的 变
量 , 使用 它 就 可 以 通 知 外 观 管 理 器 让 组 件 占 据 本 行 的 所 有 剩 余空 间 , 而 不 必
去 计 算 宽 度 值 是 多 少 , 很 自 动 化 。


3. gbc.insets = new Insets(5,6,7,8);


这 条语 句 里 面 提 到 了 两 个 拼 写 几 乎 完 全 相 同 的 词 : insets
和 Insets , 虽 然 只 相 差 一 个 字 母 : 一 个 是 大 写 I , 一 个 是 小 写 i ,但 是 它
们 代 表 的 意 义 可 大 不 相 同 。


Insets 是 AWT 里 面 一 个 类 的 名 字 , 代 表 着 类 Insets
, 它 的 用 途 是用 来 定 义 组 件 容 器 周 围 的 空 间 大 小 , 其 中 带 有 四 个 参 数:


Insets( 第 一 个 参 数 , 第 二 个 参 数 , 第 三 个 参 数 , 第
四 个 参 数 )


第 一个 参 数 代 表 距 上 面 有 几 个 点 的 空 白 , 第 二 个 参 数 代
表 距左 边 有 几 个 点 的 空 白 , 第 三 个 参 数 代 表 距 下 边 有 几 个 点的 空 白 区 域 , 第
四 个 参 数 代 表 距 右 边 留 几 个 点 的 空 白 区域 。

    形 象 一 点 的 表 示 如 图 14.9 :



图 14.9 参 数 的 设 定 顺 序


insets 是 类 GridBagConstraints 的 一 个 限 定 条 件 。


insets 和 Insets 既 然 起 的 名 字 相 同 , 两 者 之 间 也 一
定 有 相 同 之 处, 它 们 的 相 似 之 处 就 在 于 它 们 的 用 法 和 用 途 。 insets 用 来设 置
一 个 组 件 和 其 他 的 组 件 之 间 的 距 离 的 。 所 以 在 上 面程 序 里 的 按 钮 和 其 他 的 按
钮 不 同 , 它 和 其 他 的 按 钮 之 间都 有 一 定 的 距 离 , 而 不 是 和 其 他 的 按 钮 挨 在 一
起 。


总 之, 使 用 外 观 管 理 器 给 我 们 带 来 了 许 多 的 方 便 之 处 ,
使 得我 们 可 以 轻 轻 松 松 地 完 成 各 种 窗 口 的 外 观 处 理 工 作 。


使 用 外 观 管 理 器 除 了 使 得 程 序 设 计 变 得 方 便 以 外 , 还
使得 程 序 变 得 容 易 在 各 种 不 同 的 窗 口 环 境 下 运 行 , 从 而 协助 实 现 了 Java 的 多
平 台 之 梦 。


        小 结


学 会 使 用 各 种 各 样 的 外 观 管 理 器 会 带 来 事 半功 倍 的 编
程 效 果 。

这 一 章 里 新 学 习 的 类 有 :

BorderLayout , CardLayout , FlowLayout , GridLayot
, ridBagLayout , GridBagConstraints 和 Insets 。

类 GridBagLayout 生 成 的 外 观 管 理 器 是 最 具 有 灵 活性
的 外 观 管 理 器 。

类 GridBagLayout 需 要 通 过 类 GridBagconstraints
来 实现 对 程 序 窗 口 外 观 的 管 理 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:29:35 | 显示全部楼层

第九讲 设定字体(一)

教 学 纲 要


设 置并 显 示 各 种 字 体 ; 产 生 和 设 置 画 笔 颜 色 ; 设 计 窗 口
输 出样 式 ; 制 作 彩 色 标 语 。  
——————————————————————————

      要 在 屏 幕 上 绘 图 或 写 字 , 怎 样 才 能把 它 们 放 在 制
定 的 位 置 呢 ? 可 想 而 知 , 在 绘 图 平 面 内 建立 一 个 平 面 直 角 坐 标 系 , 通 过 二 维
坐 标 就 可 以 把 绘 图 位置 表 达 清 楚 。


      几 乎 所 有 的 计 算 机 都 采 用 了 相 同 的坐 标 系 统 , 当
然 Java 也 不 例 外 。 坐 标 原 点 (0,0) 位 于 整 个平 面 的 左 上 角 , 向 右 为 x 轴 ,
向 下 为 y 轴 。 所 有 的 坐 标 都必 须 是 正 整 数 , 一 个 单 位 代 表 一 个 象 素 。 坐 标 系
如 图 15.1 所 示 :



图 15.1 屏 幕 坐 标 示 意 图  


      弄 清 楚 了 坐 标 , 就 可 以 随 心 所 欲 地把 文 字 和 图 形
放 在 屏 幕 上 了 。


是 宋 体 还 是 黑 体 ?


      在 小 应 用 程 序 中 输 出 文 字 信 息 是 一个 相 当 重 要 而
且 基 本 的 功 能 。 利 用 这 一 功 能 , 我 们 就 不必 拘 泥 于 HTML 文 件 格 式 的 规 定 ,
以 自 己 想 要 的 方 式 输 出文 本 。 使 用 JAVA 提 供 的 Font 类 , 可 以 决 定 所 要 显 示
文 字 的字 体 、 大 小 和 位 置 , 使 输 出 的 文 字 更 富 于 变 化 、 更 具 特色 、 也 更 实 用
。 如 果 要 改 变 文 字 的 颜 色 , 就 要 用 到 Color 类 来 设 置 颜 色 , 加 了 颜 色 的 文
字 是 不 是 更 加 赏 心 悦 目 了呢 ?


      和 图 形 一 样 , 文 字 也 是 富 于 变 化 的。 使 用 什 么 样
的 字 体 能 使 输 出 更 加 漂 亮 ? 是 “ Times Roman ” 还 是 “ Courier ” ? 是 不
是 应 该 使 用 粗 体 或 者 斜 体 来 突出 它 的 重 要 性 呢 ? 不 论 做 了 怎 样 的 决 定 , 都 要
依 靠 Font 类 来 产 生 字 体 对 象 实 体 。 通 过 对 Font 对 象 进 行 控 制 就 可以 在 JAVA
里 写 出 优 美 漂 亮 的 字 来 。


      要 产 生 Font 对 象 很 简 单 , 就 和 说 明 可口 可 乐 是 饮
料 一 样 简 单 , 只 要 按 照 下 面 的 格 式 来 说 明 就可 以 了 :


      Font ( 字 型 名 , 字 体 样 式 , 字 体 大 小)


      字 型 名 : 顾 名 思 义 , 就 是 所 要 使 用的 字 型 的 名 字
, 正 如 上 面 提 到 的 , 是 宋 体 、 TimesRoman, 还是 Arial 、 或 者 Courier?


      字 体 样 式 : 指 的 是 字 的 外 观 。 是 黑体 ( BOLD ) 、
还 是 斜 体 ( ITALIC ) ? Font 类 型 中 已 经 事 先定 义 好 了 一 些 常 数 来 表 示 字 体
样 式 , 它 们 分 别 是 : BOLD 表 示 黑 体 、 ITALIC 表 示 斜 体 、 PLAIN 表 示 正 常
字 体 。


      字 体 大 小 : 指 的 是 每 个 字 或 者 字 母的 大 小 。


      讲 到 这 里 , 应 该 问 Font 对 象 到 底 是 怎么 产 生 的 呢
? 我 们 来 看 一 个 例 句 就 清 楚 了 。

  1.     Font fnA = new Font ( TimesRoman", FONT.PLAIN.20
  2. ) ;
复制代码

在 这 句 话 里 , fnA 就 是 我 们 自 己 定 义 的 一 种字 体 , 它 是 Font
类 的 一 个 对 象 , 或 者 说 是 Font 类 的 一 个 数据 变 量 , 这 个 变 量 名 是 fnA 。 道
理 和 “ int x ; ” 说 明 了 x 是 一 个 整 数 变 量 一 样 简 单 。 这 里 Font 和 int 一
样 是 一 种 数据 类 型 , 而 fnA 和 x 一 样 是 编 程 者 为 变 量 取 的 名 字 。

    new 又 是 什 么 呢 ? 就 是 新 建 一 个 对 象 的意 思 。

    Font ( TimesRoman", FONT.PLAIN.20 ) 就 应
该 比较 熟 悉 了 。 它 就 是 对 fnA 的 描 述 。 那 么 整 句 话 的 意 义 就 清楚 了 , 即 “ 新
建 一 个 名 为 fnA 的 字 体 对 象 , 这 个 新 定 义 的字 体 是 TimesRoman 的 正 常 体 ,
大 小 为 20 号 。 ”




  


如 果想 使 字 体 是 斜 体 , 就 可 以 这 样 定 义

  1.     Font fnB = new Font ( "Arial " , Font.ITALIC,18 )
  2. ;
复制代码


      那 么 , 想 让 它 既 是 粗 体 又 是 斜 体 又怎 么 定 义 呢 ? 照 下 面 这 样 定 义 就
可 以 了 :

    Font fnC = new Font ( "Courier " , Font.ITALIC+Font.BOLD,40
) ;

    尽 管 我 们 可 以 在 程 序 里 随 心 所 欲 地 指定 想 要 的 字 体 , 但 是 否 能 如 你 所 愿
, 得 到 正 确 的 字 体 呢? 这 就 得 看 执 行 程 序 的 系 统 是 否 支 持 你 所 定 义 的 那 些 字型
了 。 假 如 你 指 定 了 “ 楷 体 ” , 也 许 在 你 的 系 统 上 执 行没 有 问 题 , 而 在 别 人 的
机 器 上 没 有 安 装 这 种 字 型 , 他 看到 的 就 不 是 楷 体 , 而 是 “ 宋 体 ” 或 者 别 的 什
么 。 所 以 定义 字 体 的 时 候 最 好 用 常 见 的 字 型 。 例 如 : TimesRoman , Arial
, Courier...


显 示 的 方 法


      定 义 了 字 体 , 怎 么 把 它 显 示 出 来 呢? 要 知 道 Applet
想 在 屏 幕 上 画 任 何 东 西 , 第 一 个 要 使 用 的就 是 Graphics 这 个 类 。 显 示 之 前
, 首 先 要 用 Graphics 中 的 setFont 设 置 已 经 定 义 过 、 并 准 备 显 示 的 字 体 ,
然 后 再 调 用 显 示方 法 来 输 出 文 字 。 在 这 个 类 中 用 来 输 出 文 字 的 方 法 有 三个 :
  1. drawString 、 drawChars 、 drawBytes 。 1. drawString ( String str,
  2. int x, int y)
复制代码


      str 是 一 个 字 符 串 ( String ) 类 型的 变 量 , 可
以 事 先 赋 值 。

      x 和 y 用 来 指 定 显 示 这 个 字 符 串 的位 置 。 注 意
, 这 里 所 提 的 位 置 是 指 字 的 基 线 位 置 , 而 不是 习 惯 的 矩 形 左 上 角 坐 标 。 这 里
先 来 看 一 个 例 句

  1.     drawString ( "I am your first java applet
  2. . " , 25 , 50 ) ;
复制代码


看 了 这 条 语 句 , 你 可 能 要 问 “ str 哪 里 去了 ? ” , 告
诉 你 一 个 诀 窍 , 调 用 drawString 时 , 你 可 以 直接 把 要 输 出 的 那 句 话 写 在 参
数 str 的 位 置 , 并 且 用 “ ” 号把 它 括 起 来 就 行 了 。 这 样 做 的 效 果 和 下 面 这 两
句 话 是 一样 的 。

  1.     String str = " I am your first java
  2. applet .";

  3.     g.drawString ( str , 25,50 );
复制代码


既 然 能 用 一 条 语 句 实 现 , 为 什 么 还 要 用两 条 呢 ?


2. drawChars 用 来 输 出 给 定 字 符 数 组 或数 组
数 据 的 一 部 分 。 其 标 准 格 式 如 下 :

    drawChars ( char data[ ] , int offset ,int
length, int x, int y ) 这 么 一 大 堆 参 数 , 都 是 什 么 意 思 ?

    data[ ] 是 指 要 显 示 的 字 符 型 数 组 。

    offset 和 length 分 别 指 从 数 组 的 第 几个 字 符 开
始 显 示 , 一 共 显 示 多 少 个 字 符 。

    x 和 y 的 作 用 和 drawString 的 一 样 , 用来 指 示 显
示 字 符 的 位 置 , 下 面 来 看 一 个 例 句

   
  1. char char1[ ] = {'H', 'e', 'l', 'l', 'o',
  2. ',', 'I', ' ', 'a', 'm', ' ', 'j', 'a', 'v', 'a','.'};

  3.     g.drawChars = (char1,3,8,10,20);
复制代码


这 两 条 语 句 将 以 ( 10,20 ) 为 基 线 开 始 输出 “ lo I am
j"

    因 为 数 组 的 下 标 是 从 0 开 始 的 , 所以 在 上 面 的 字
符 数 组 里 , 第 0 个 元 素 是 “ H ” , 第 1 个 元素 是 “ e" , 第 8 个 元 素 是
“ a ” , 依 此 类 推 。 还 有 , 在 字符 数 组 里 , 空 格 也 算 一 个 字 符 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:34:38 | 显示全部楼层

第十讲 设定字体(二)

教 学 纲 要


设 置并 显 示 各 种 字 体 ; 产 生 和 设 置 画 笔 颜 色 ; 设 计 窗 口
输 出样 式 ; 制 作 彩 色 标 语 。

——————————————————————

3. drawBytes 弄 清 楚 上 面 两 个 方 法 , 这 就 简 单 多 了 。
它 用 来 输 出 byte 数 组 中 的 数 值 所 对 应 的 字 符 。 标 准 格 式 如 下 所 示 :

    drawBytes ( byte data[ ], int offset, int length,
int x, int y);


      可 见 , 它 和 drawChars 很 相 似 , 只 不 过 byte 数
组 中 的 元 素 代 表 的 是 字 符 的 ASCII 码 。 比 如 “ A ” 的 ASCII 码 是 65 , B 的
是 66... 其 他 参 数 的 意 义 和 drawChars 中 的一 样 , offset 指 定 输 出 的 起 始
字 符 , length 说 明 输 出 字 符串 的 长 度 , x 和 y 表 示 显 示 的 位 置 。 还 是 举 个
例 子 吧 。

    byte byte1[ ] = {65,66,67,68,70,71,72,73,74,75}

    g.drawBytes( byte1,2,7,10,40);

这 两 条 语 句 将 在 ( 10 , 40 ) 处 显 示 “ CDEFGHI ” 。


      百 闻 不 如 一 见 , 现 在 让 我 们 用 一 个程 序 来 看 个 究
竟 吧 。

程 序 15.1

     
  1. // ShowText.java

  2.       import java.awt.Graphics;

  3.       import java.awt.Font;

  4.       public class ShowText extends java.applet.Applet

  5.       {

  6.         Font fn = new Font("TimesRoman",Font.BOLD,12);
  7. // 产 生 一 个 名 为 fn 的 字 体

  8.         String str = "This is drawString test.";
  9. // 给 字 符 串 赋 值

  10.         char ch[] = {'T','h','i','s',' ', 'i','s','
  11. ','a',' ','t','e','s','t','.'}; // 给 字 符 数 组 赋 值

  12.         byte by[] = {65,66,67,68,69,70,71,72,73,74};
  13. // 给 byte 数 组 赋 值

  14.         public void paint(Graphics g)

  15.         { g.setFont(fn); // 设 置 当 前 字 体 为 fn

  16.             g.drawString(str,10,50); // 在 ( 10 ,
  17. 50 ) 处 显 示 字 符 串 str

  18.             g.drawChars(ch,0,15,10,70); // 在 (10,70)
  19. 处 显 示 字 符 数 组 ch 的 第 0 个 到 第 15 个 字 符

  20.           g.drawChars(ch,3,6,30,90); // 显 示 ch 的
  21. 第 3 个 到 第 6 个 字 符

  22.           g.drawBytes(by,0,10,50,140);

  23.           g.drawBytes(by,2,5,200,100); // 显 示 by
  24. 数 组 的 第 2 到 第 5 个 字 符

  25.         }

  26.       }
复制代码

      上 面 的 程 序 都 看 懂 了 吗 ? 这 里 我 们用 到 了 两 个 程
序 包 : java.awt.Graphics 和 java.awt.Font , 因 为程 序 中 用 到 的 方 法 drawString
、 drawChars 和 drawBytes 都 在 Graphics 程 序 包 里 , Font 类 是 属 于 Font
这 个 程 序 包 的 。

    Font fn = new Font ("Courier", Font.BOLD,
20 ) ; 就 是 前 面 讲 过 的 , 产 生 一 个 新 的 字 体 名 叫 fn , 它 是 20 号 的 Courier
粗 体 。

    g.setFont ( fn ) ; 当 然 就 是 把 当 前 的 字 体设 置 为
刚 才 定 义 过 的 fn , 然 后 用 g.drawString 、 g.drawChars 和 g.drawBytes
来 输 出 字 符 , 对 照 运 行 结 果 , 很 容 易 理 解 每 一条 语 句 的 意 思 。 尽 管 有 多 种 方
法 可 以 显 示 字 符 , 不 过 大部 分 情 形 下 , 使 用 drawString 就 足 够 了 。

彩 色 的 字


      想 像 一 下 , 如 果 自 己 的 主 页 里 都 是白 纸 黑 字 , 是
不 是 觉 得 少 了 点 什 么 呢 ? 那 就 给 它 加 点 颜色 瞧 瞧 , 还 有 什 么 能 比 五 彩 缤 纷 的
主 页 更 能 吸 引 人 呢 ?


      要 写 出 彩 色 的 字 , 首 先 要 设 置 写 的 字和 画 的 图 的
颜 色 , 就 像 画 家 要 作 画 , 先 要 调 颜 料 一 样 。产 生 颜 色 的 方 法 和 产 生 字 体 很 相
像 , 不 过 这 次 我 们 用 的是 Color 类 , 而 不 是 Font 类 了 。 先 调 用 Color 类 的
构 造 函 数, 产 生 一 个 Color 对 象 , 再 用 Graphics 类 里 的 SetColor 把 它 设置
到 Graphics 对 象 上 。 也 就 是 调 好 颜 色 , 然 后 放 到 画 笔 上。


      要 说 明 Color 对 象 很 简 单 , 我 们 知 道任 何 一 种 颜
色 都 可 以 由 红 、 绿 、 蓝 三 原 色 合 成 。 JAVA 里制 造 新 的 颜 色 也 只 需 给 定 三 原
色 的 数 值 就 可 以 了 。 其 说明 格 式 如 下 :

    Color ( int red , int green , int blue ) ;


    红 、 绿 、 蓝 三 原 色 的 数 值 必 须 界 于 0 到 255 之 间 ,
而 且 三 个 数 值 表 示 的 顺 序 必 须 是 红 、 绿 、 蓝 。


例 如 : Color r1 = new Color (255, 0, 0) ; 这 条 语
句就 产 生 了 一 个 名 为 r1 的 红 颜 色 。


      看 看 这 句 话 产 生 了 一 种 什 么 样 的 颜色 呢 ? 我 也 不
知 道 。

    Color my_color = new Color ( 10,200,10);


      此 外 , 你 还 可 调 节 颜 色 的 明 暗 , 只需 使 用 Color
类 提 供 的 函 数 brighter( ) 和 darker( ) 就 可 以 得 到比 指 定 颜 色 亮 一 些 或 者
暗 一 些 的 颜 色 。


      好 了 , 现 在 可 以 随 心 所 欲 地 定 义 各种 各 样 的 颜 色
了 。 不 过 , 如 果 你 想 要 的 颜 色 不 是 太 离 奇的 话 , 可 以 直 接 使 用 Color 类 中 已
经 定 义 好 的 各 种 颜 色 常数 , 而 不 用 自 己 费 心 去 调 色 了 。 例 如 : g.getColor(
Color.pint); 这 句 话 把 当 前 画 图 和 写 字 的 颜 色 置 为 粉 色 。
 楼主| 发表于 2006-3-3 08:37:33 | 显示全部楼层

第十一讲 设定字体(三)

教 学 纲 要


继 续制 作 彩 色 标 语 。
_____________________________________

设 置好 了 彩 笔 , 那 就 用 它 来 写 几 个 彩 色 的 字 吧 。 编 辑 一
个 名为 ColorText.java 的 程 序 , 以 及 它 的 HTML 文 件 。

程 序 15.2


  1. // ColorText.java

  2. import java.awt.Graphics ;

  3. import java.awt.Font ;

  4. import.java.awt.Color ;


  5. public class ColorText extends java.applet.Applet

  6. {

  7. Font fn1 = new Font("TimesRoman",Font.BOLD+Font.ITALIC,20);
  8. // 产 生 两 种 新 的 字 体

  9. Font fn2 = new Font("Braggadocio",Font.BOLD,45);
  10. // fn1 和 fn2


  11. public void paint(Graphics g)

  12. {

  13. g.setFont(fn1); // 设 置 当 前 字 体 为 fn1

  14. g.drawString("Beautiful Text!",10,20);
  15. // 用 当 前 字体 在 (10 , 20) 处 输 出 文 本

  16.           g.setColor(Color.lightGray); // 写 一行 带
  17. 阴 影 的 字 , 字 为 粉 色 , 阴 影 为

  18. g.drawString("Beautiful Text!",10,45);
  19. // 浅 灰 色

  20.           g.setColor(Color.pink);

  21.           g.drawString("Beautiful Text!",10,47);

  22.           Color my_color = new Color(4,200,2); //
  23. 产 生 一 个 新 的 颜 色 , 名 叫 my_color

  24.           g.setColor(my_color); // 把 当 前 画 笔设 置
  25. 为 my_color 的 颜 色

  26.           g.drawString("A Colorful World!",250,70);

  27.           Color darker = my_color.darker( ); //
  28. 产 生 一 个 比 my_color 稍 暗 的 颜 色

  29.           g.setColor(darker);

  30.           g.drawString("A Colorful World!",250,100);

  31.           Color brighter = my_color.brighter( );
  32. // 产 生 一 个 比 my_color 稍 亮 的 颜 色

  33.           g.setColor(brighter);

  34.           g.drawString("A Colorful World!",250,40);

  35.           g.setFont(fn2); // 把 当 前 字 体 设 置为 fn2

  36.           g.setColor(Color.red);

  37.           g.drawString("How Beautiful Homepage!
  38. ",10,145); // 用 字 体 fn2 写 一 行 带 红 边 的

  39.           g.setColor(Color.white); // 白 字

  40.           g.drawString("How Beautiful Homepage!
  41. ",12,143);

  42.         }

  43.       }
复制代码
该 程 序 的 HTML 文 件 如 下 所 示 :

[见附件]




编 辑结 束 , 顺 利 编 译 后 就 可 以 运 行 了 , 运 行 结 果 如 图 15.3 所示 。





图 15.3 显 示 彩 色 的 字  


      在 这 个 程 序 中 Color my_color = new Color ( 4 , 200 , 2 ); 产
生 了 一 种 新 的 颜 色 , 名 叫 my_color, 它 的 RGB 值 是 (4,200,2) 。

    g.setColor(my_color); 是 把 新 产 生 的 那 种 颜色 设 置 到 画 笔 上 准 备 使 用



      当 你 想 得 到 一 种 比 所 指 定 的 颜 色 稍深 一 些 的 颜 色 , 所 要 做 的 事 情 很
简 单 , 你 只 需 这 样 写 : Color darker = my_color . darker ( ); 当 然 ,
这 种 稍 暗 的 颜 色 不一 定 叫 darker , 你 可 以 叫 它 John 或 者 Jack 什 么 的 , 也
许 你想 要 的 不 是 比 my_color 稍 暗 的 颜 色 , 而 是 暗 红 或 者 暗 紫 ,只 需 要 把 my_color
换 成 你 想 要 的 那 种 颜 色 就 行 了 。 那 么 lighter 是 不 是 也 一 样 呢 ? 当 然 , 完
全 一 样 。 不 同 的 只 是 从 lighter 那 里 得 到 的 是 稍 亮 一 些 的 颜 色 而 已 。


      从 运 行 结 果 不 难 发 现 , 使 用 不 同 的颜 色 可 以 写 出 有 立 体 效 果 的 字 来
。 你 还 有 什 么 绝 妙 的 主意 , 尽 管 拿 出 来 , 创 造 令 人 瞠 目 结 舌 的 主 页 。


                    小 结  


      今 天 就 学 到 这 里 , 休 息 之 前 让 我 们总 结 一 下 , 学 习 完 这 一 章 , 你 应
该 知 道




用 坐 标 ( x , y) 来 定 位 屏 幕 上 的 每 一 个 点 , 屏幕 的 原 点 在 左 上 角 。

用 类 似 Font my_font = new Font ( "times Roman" , Font.PLAIN
, 30 ); 这 样 的 句 子 来 创 造 一 种 新 的 字 体 。

在 输 出 文 字 之 前 别 忘 了 用 g.setFont(my_font); 这 条语 句 设 置 所 写 字 的
字 体 。

输 出 文 字 有 三 种 方 法 , 不 过 最 常 用 的 , 你 应该 记 住 的 是 drawString 。

记 住 用 Color my_color = new Color ( 20 , 150 , 65 ); 可以 调 出 一
种 新 的 颜 色 。 把 它 设 置 到 画 笔 上 应 该 用 g.setColor(my_color); 这 条 语
句 , 然 后 你 就 可 以 用 这 支 彩 色 的 笔 去 写 去 画 了 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:40:15 | 显示全部楼层

第十二讲 绘图(一)

教 学 纲 要


你 现在 已 经 可 以 在 Java 程 序 里 写 各 种 各 样 的 字 了 , 那 么
有 没有 想 过 再 加 点 图 形 , 让 你 的 主 页 看 上 去 更 加 优 美 呢 ? 这一 章 我 们 将 学 习
如 何 使 用 Graphics 类 提 供 的 各 种 绘 图 方 法, 发 挥 你 的 创 造 力 , 画 出 漂 亮 的
图 形 。

_____________________________________

你 现在 已 经 可 以 在 Java 程 序 里 写 各 种 各 样 的 字 了 , 那 么
有 没有 想 过 再 加 点 图 形 , 让 你 的 主 页 看 上 去 更 加 优 美 呢 ? 这一 章 我 们 将 学 习
如 何 使 用 Graphics 类 提 供 的 各 种 绘 图 方 法, 发 挥 你 的 创 造 力 , 画 出 漂 亮 的
图 形 。



绘画 的 基 础 — 线 条


画 线是 绘 图 功 能 里 最 基 本 的 方 法 , Java 程 序 中 使 用 Graphics
类提 供 的 drawLine 来 画 线 。 drawLine 的 标 准 格 式 如 下 :


drawLine ( int x1,int y1,int x2,int y2)

很 显 然 , 这 就 是 在 ( x1, y1) 和 (x2 , y2) 两 点之 间 画 一
条 线 。 再 说 得 具 体 一 点

例 如: g.drawLine (10 ,10 ,200 , 200 ) 这 就 从 ( 10
, 10 ) 到 ( 200 , 200 ) 画 了 一 条 线 。


Java 没 有 提 供 专 门 画 点 的 指 令 , 不 过 , 我 们 完 全 可 以
用 画 线的 功 能 画 出 一 个 点 来 。 只 要 在 drawLine 里 把 起 始 点 和 终 止点 指 定 为 同
一 个 点 就 相 当 于 在 该 坐 标 上 画 了 一 个 点 。


例 如: g.drawLine (80 ,100 ,80 , 100 ) 是 在 ( 80
, 100 ) 上 画 了 一 个点 。


画 线的 功 能 比 较 简 单 , 这 里 就 不 单 独 举 例 了 。 在 下 一 节
的 例子 里 , 你 就 可 以 看 到 程 序 里 究 竟 是 怎 么 用 drawLine 的 。


矩形 的 世 界


绘 制矩 形 也 是 基 本 绘 图 方 法 的 一 种 。 Java 提 供 了 绘 制
三 种 矩形 的 方 法 , 这 三 种 矩 形 分 别 是 : 普 通 矩 形 , 圆 角 矩 形 和立 体 矩 形 。


普通 矩 形


画 普通 矩 形 , Java 又 提 供 了 三 个 方 法 , 用 这 三 个 方 法
就 可 以把 四 四 方 方 的 矩 形 画 出 变 化 和 效 果 来 。 这 三 个 方 法 分 别是 :


1. drawRect ( int x , int y , int width , int
height ) , 它 的 功 能 是 画 出 一 个矩 形 框 , 也 就 是 说 drawRect 画 出 的 矩 形 是
空 心 的 。 (x , y) 指 定 了 矩 形 左 上 角 的 位 置 。 width 和 height 分 别 指 定 了
矩 形的 长 和 宽 。


例 如: g.drawRect ( 10 , 20 , 200 , 150 ); 就 是 以
( 10 , 20 ) 为 左 上角 , 画 一 个 长 200 个 点 , 宽 150 个 点 的 矩 形 框 。


2. fillRect ( int x , int y , int width , int
height ) , 这 个 方 法 是 以 当 前 的颜 色 填 充 一 个 矩 形 , 其 参 数 的 意 义 和 drawRect
的 一 样 。 可见 fillRect 和 drawRect 很 相 似 , 区 别 仅 在 于 fillRect 画 的 是
实心 的 矩 形 , 而 drawRect 画 的 只 是 个 框 而 已 。


3. clearRect ( int x , int y , int width , int
height ) , 又 是 一 个 和 前 面 两 个很 相 似 的 方 法 , 可 是 clearRect 和 fillRect
的 功 能 正 好 相 反 ,它 是 用 背 景 色 把 矩 形 填 满 。 换 而 言 之 , 就 是 清 除 fillRect
的 效 果 , 你 可 别 小 看 它 , 使 用 得 当 会 让 你 的 主 页 增 色 不少 呢 。


圆角 矩 形


在 Java 里 , 除 了 提 供 绘 制 一 般 矩 形 的 方 法 外 , 还 提 供
了 绘 制 圆角 矩 形 的 功 能 。 和 绘 制 普 通 矩 形 类 似 , 画 圆 角 矩 形 也 有两 个 方 法 ,
它 们 分 别 是 :


1. drawRoundRect ( int x , int y , int width ,
int height , int arcWidth, int arcHeight )


它 和普 通 矩 形 中 的 drawRect 是 对 应 的 , 其 功 能 是 画 一 个
圆 角 矩形 框 。 所 不 同 的 是 drawRoundRect 比 drawRect 多 了 两 个 参 数 arcWidth
和 arcHeight, 它 们 分 别 表 示 圆 弧 的 横 向 直 径 和 纵 向 直 径 。各 个 参 数 究 竟 都
是 什 么 意 思 呢 ? 看 看 下 面 的 示 意 图 ( 图 16.1 ) 就 明 白 了 。



图 16.1 圆 角 矩 形 参 数 示 意 图

* Java 里 所 有 的 坐 标 值 、 长 度 、 宽 度 的 单位 都 是 象 素 ,
也 就 是 我 们 常 说 的 点 数 。


2. fillRoundRect ( int x , int y , int width ,
int height , int arcWidth, int arcHeight )


它 和普 通 矩 形 中 的 fillRect 是 对 应 的 , 其 功 能 是 填 充
一 个 圆 角矩 形 。 各 个 参 数 的 意 义 也 与 drawRoundRect 中 的 一 样 。 这 里就 不 再
赘 述 了 。







现 在来 看 看 漂 亮 的 矩 形 是 怎 么 画 出 来 的 。


程 序 16.1    
  1. // Rect.java

  2.     import java.awt.Graphics;

  3.     import java.awt.Color;

  4.     public class Rect extends java.applet.Applet

  5.     { public void init( )

  6.         { resize(340,300); } // 初 始 化 一 个 340 × 300 的 作 图 区 域

  7.         public void paint(Graphics g)

  8.         { g.drawRect(10,10,140,100); // 以 ( 10 , 10 ) 为 左 上 角 ,
  9. 画 一 个 140*100 的 矩 形

  10.             g.setColor(Color.pink); // 以 ( 160 , 10 ) 为 左 上 角 ,
  11. 画 一 个 粉 色 的 矩 形

  12.             Rect(160,10,140,100);

  13.             g.setColor(Color.lightGray); // 以 (154,134) 为 左 上 角
  14. , 画 一 个 带 浅 灰 色 阴 影 的 绿 色 圆 角 矩 形

  15.             g.fillRoundRect(160,140,140,100,40,40);

  16.             g.setColor(Color.green);

  17.             g.fillRoundRect(154,134,140,100,40,40);


  18.             g.setColor(Color.red);

  19.             g.drawLine(10,100,150,100); // 在 第一 个 矩 形 里 画 两 条 红
  20. 线

  21.             g.drawLine(10,102,150,102);

  22.             g.drawRoundRect(170,20,120,80,60,60); // 在 第 二 个 矩 形
  23. 中 画 一 个 红 色 的 圆 角 矩 形 框

  24.             g.setColor(Color.blue); // 在 第 一个 矩 形 里 画 两 条 蓝 线

  25.             g.drawLine(140,10,140,110);

  26.             g.drawLine(142,10,142,110); // 以 ( 10 , 140 ) 为 左 上
  27. 角 填 充 一 个 蓝 色 矩 形 , 然 后 清 除 它 的 中心 区 域

  28.             g.fillRect(10,140,140,100);

  29.             g.clearRect(20,150,120,80);

  30.         }

  31.     }
复制代码


该 程 序 的 HTML 文 件 如 下 :





编 辑结 束 , 顺 利 编 译 后 就 可 以 运 行 了 , 运 行 结 果 如 图 16.2 所示 :




图 16.2 各 种 各 样 的 矩 形


看 看程 序 运 行 结 果 , 再 对 照 一 下 程 序 , 你 对 程 序 中 每 一 句 话的 作 用 都 理 解
了 吗 ? 程 序 一 开 始 就 引 入 了 java.awt.Graphics 和 java.awt.Color 两 个 程
序 包 , 你 应 该 记 住 , 凡 是 与 图 形 有关 的 程 序 前 面 都 应 该 加 上 这 句 话 : import
java.awt.Graphics ; 当 然 你 总 不 会 希 望 你 画 的 图 都 是 黑 白 的 吧 , 那 么 要
画 彩色 的 图 , 还 要 加 上 这 句 话 : import java.awt.color;


* 这 个 程 序 里 还 有 一 个 也 许 你 从 来 没 有 见过 的 方 法 --init( ) 。 这 个 方 法
是 Applet 一 出 生 第 一 个 要 执行 的 方 法 , 它 的 作 用 就 是 做 一 些 程 序 的 初 始 化
设 置 , 例如 : 初 始 化 作 图 区 域 , 预 先 加 载 图 片 等 。 这 个 程 序 的 init 只 包 含
了 一 句 话 resize ( 340 , 300 ); 这 句 话 初 始 化 了 这 个 程序 的 运 行 区 域 。 你
也 许 要 问 , 在 它 的 HTML 文 件 里 不 已 经过 程 序 运 行 区 域 了 吗 ? 的 确 , 可 是 如
果 你 在 程 序 里 用 resize 重 新 设 置 以 后 , HTML 文 件 里 的 设 置 就 不 起 作 用 了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:44:10 | 显示全部楼层

第十三讲 绘图(二)

画弧


画 弧其 实 就 相 当 于 画 部 分 椭 圆 , 所 以 画 弧 和 画 椭 圆 的 方
法 很相 似 , 其 标 准 格 式 如 下 :

  1.       drawAcr ( int x, int y, int width, int height,
  2. int startAngle , int arcAngle)

  3.       fillAcr ( int x, int y, int width, int height,
  4. int startAngle , int arcAngle)
复制代码



显 然前 面 四 个 参 数 和 画 矩 形 、 椭 圆 所 用 到 的 参 数 含 义 完
全 相同 , 就 是 先 用 矩 形 的 概 念 描 述 弧 所 在 的 椭 圆 , 然 后 用 最后 两 个 参 数 来 说
明 弧 是 椭 圆 的 哪 一 部 分 。 startAngle 是 弧的 起 始 角 度 , 而 arcAngle 表 示 从
起 始 角 转 多 少 度 , 逆 时 针转 为 正 , 顺 时 针 转 为 负 。 starAngle 和 arcAngle
的 单 位 都 是 度。 如 果 给 定 的 两 个 参 数 值 大 于 360 度 , 它 将 被 初 始 化 为 0 到 360
之 间 。 例 如 750 度 和 390 度 都 将 被 初 始 化 为 30 度 。 明白 这 是 为 什 么 吗 ? 其
实 就 是 用 750 度 除 以 360 度 取 余 数 就是 初 始 化 角 度 。


下 面用 图 16.5 来 说 明 这 两 个 参 数 的 意 义



图 16.5 画 弧 参 数 示 意 图( 单 位 : 度 )


fillArc 的 作 用 是 填 充 弧 到 椭 圆 中 心 的 连 线 所 围 成 的
扇 形 区 域 。按 惯 例 , 我 们 该 看 个 例 子 了 。

程 序 16.3

   
  1. // colordisc.java

  2.     import java.awt.Graphics;

  3.     import java.awt.Color;

  4.     public class colordisc extends java.applet.Applet

  5.     { public void init( )

  6.         {

  7.         resize(300,300); // 初 始 化 作 图 区 域

  8.         }

  9.         public void paint(Graphics g)

  10.         {

  11.             g.setColor(Color.green); // 以 ( 20 ,
  12. 20 ) 为 左 上 角 , 分 别 从 45 度 和

  13.             g.fillArc(20,20,100,100,225,45); //
  14. 225 度 开 始 , 顺 时 针 画 一 个 直 径 为 100 的 45 度 绿 色 扇 形

  15.             g.fillArc(20,20,100,100,45,45);

  16.             g.fillOval(160,40,120,80); // 以 ( 160
  17. , 40 ) 为 左 上 角 , 填 充 一 个 椭 圆

  18.             g.setColor(Color.orange); // 画 橙色 扇


  19.             g.fillArc(20,20,100,100,90,45);

  20.             g.fillArc(20,20,100,100,270,45) ;

  21.             g.drawOval(20,160,80,100); // 以 ( 20
  22. , 160 ) 为 左 上 角 画 椭 圆

  23.             g.setColor(Color.magenta); // 画 紫色 扇


  24.             g.fillArc(20,20,100,100,135,45);

  25.             g.fillArc(20,20,100,100,315,45);

  26.             g.setColor(Color.blue); // 画 蓝 色扇 形

  27.             g.fillArc(20,20,100,100,180,45);

  28.             g.fillArc(20,20,100,100,0,45);

  29.             for (int i = 0;i<15;i++) // 画 一把
  30. 折 扇

  31.             { g.fillArc(120,160,150,100,(15+i*10),10);

  32.                 i++ ;

  33.                   g.drawArc(120,160,150,100,(15+i*10),10);

  34.             }

  35.         }

  36.     }
复制代码

      该 程 序 的 HTML 文 件 如 下 :





编 辑结 束 顺 利 编 译 后 就 可 以 运 行 了 , 运 行 结 果 如 图 16.6
所 示:



图 16.6 彩 色 的 圆 盘


在 这个 程 序 里 , 我 们 用 画 扇 形 的 方 法 画 了 一 个 彩 色 的 圆
盘 ,又 用 一 个 循 环 结 构 画 了 一 把 折 扇 。 下 面 我 们 来 仔 细 分 析一 下 这 个 循 环 结
构 是 怎 么 画 出 折 扇 来 的 。

  1.               for (int i = 0;i<15;i++)

  2.     { g.fillArc(120,160,150,100,(15+i*10),10);

  3.         i++ ;

  4.         g.drawArc(120,160,150,100,(15+i*10),10);
  5. }
复制代码


当 i = 0 时 , g.fillArc 以 ( 120 , 160 ) 为 左 上角 , 在
长 150 宽 100 的 椭 圆 区 域 内 , 从 15 度 开 始 逆 时 针 画了 一 个 10 度 的 扇 形 , 然
后 i++ 使 i 变 成 1 , g.drawArc 又 在 此基 础 上 , 以 25 度 开 始 逆 时 针 画 一 段
10 度 的 弧 , 然 后 再 开始 下 一 个 循 环 , 此 时 i 变 成 了 2 , 那 么 扇 形 就 应 该 从
35 度开 始 画 了 , 依 此 类 推 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:47:17 | 显示全部楼层

第十四讲 绘图(三)

多边 形


能 够 画 矩 形 、 椭 圆 和 弧 似 乎 还 不 能 满足 作 图 的 需
要 。 这 一 节 里 将 介 绍 多 边 形 的 绘 图 方 法 , 而实 际 上 绘 制 多 边 形 就 是 给 定 两 组
坐 标 , 一 组 x 坐 标 , 一组 y 坐 标 , 按 顺 序 将 给 定 的 这 一 组 坐 标 连 接 起 来 就 可
以绘 出 一 个 多 边 形 , 绘 制 多 边 形 的 基 本 方 法 格 式 如 下 :

      drawPolygon ( int x[ ], int y[ ], int n )

      fillPolygon ( int x[ ], int y[ ], int n )


这 两个 方 法 中 , 参 数 中 x[ ] 、 y[ ] 分 别 是 多 边 形 顶 点
的 x 坐 标和 y 坐 标 , n 表 示 多 边 形 的 顶 点 数 。 drawPolygon 并 不 能 自 动形 成
封 闭 区 域 , 所 以 要 绘 制 封 闭 多 边 形 , 必 须 确 保 第 一个 顶 点 和 最 后 一 个 顶 点 坐
标 相 同 。 fillPolygon 则 无 需 这 样做 。


如 果想 在 图 中 的 另 一 个 区 域 画 一 个 同 样 的 多 边 形 , 你 会
怎 么做 呢 ? 重 复 前 面 的 每 一 条 指 令 , 并 修 改 每 个 点 的 坐 标 。哦 ! 可 千 万 别 那
样 做 。 现 在 就 介 绍 一 种 可 以 轻 轻 松 松 解决 这 个 问 题 的 方 法 --copyArea 。 其
标 准 格 式 如 下 :

      copyArea ( int x0 , int y0 , int width , int
height , int x1 , itn y1 )


前 面的 四 个 参 数 应 该 都 很 熟 悉 了 , 它 们 指 定 了 要 复 制 的
矩 形区 域 , 最 后 两 个 参 数 表 示 所 要 复 制 的 区 域 距 原 位 置 的 x 、 y 偏 移 量 。 当
x1 和 y1 为 负 , 复 制 到 原 位 置 的 左 边 或 上边 。 反 之 若 x1 和 y1 为 正 , 则 复 制
到 右 边 和 下 边 。


你 想试 试 这 个 方 法 有 多 好 用 吗 ? 试 试 下 面 的 程 序 吧


程 序 16.4
  1.     // poly.java

  2.     import java.awt.Graphics;

  3.     import java.awt.Color;

  4.     public class poly extends java.applet.Applet

  5.     { int poly1_x[ ] = {10,20,80,90,50,10}; // 指
  6. 定第 一 个 多 边 形 的 x 、 y 坐 标

  7.             int poly1_y[ ] = {20,10,10,20,60,20};

  8.             int poly1_ptnum = 6; // 指 定 第 一个 多 边
  9. 形 的 边 数

  10.             int poly2_x[ ] = {110,120,180,190,150,110};
  11. // 指 定 第 二 个 多 边 形 的 x 、 y 坐 标

  12.             int poly2_y[ ] = {20,10,10,20,60,20};

  13.             int poly2_ptnum = 6; // 指 定 第 二个 多 边
  14. 形 的 边 数


  15.         public void paint(Graphics g)

  16.         {

  17.             g.drawPolygon(poly1_x,poly1_y,poly1_ptnum);
  18. // 以 省 缺 的 颜 色 画 第 一 个 多 边 形

  19.             g.setColor(Color.pink);

  20.             g.fillPolygon(poly2_x,poly2_y,poly2_ptnum);
  21. // 用 粉 色 填 充 第 二 个 多 边 形

  22.             g.copyArea(108,8,85,60,-50,50); // 把
  23. 第 二 个 多 边 形 拷 贝 到 距 原 位 置 向 左 50 , 向 右 50 的 位 置

  24.         }

  25.     }
复制代码


      该 程 序 的 HTML 文 件 如 下 所 示 :
  1. < HTML>

  2. < HEAD>

  3. < TITLE>Polygon< /TITLE>

  4. < /HEAD>

  5. < BODY>

  6. < APPLET CODE = "poly.class" WIDTH
  7. = 200 HEIGHT = 120>< /APPLET>

  8. < /BODY>

  9. < /HTML>
复制代码

编 辑 完 以 后 , 顺 利 通 过 编 译 就 可 以 运 行 了, 运 行 结 果 如 图
16.7 所 示 :



图 16.7 程 序 16.4 运 行 结 果


现 在图 中 有 三 个 钻 石 形 状 的 多 边 形 , 而 我 们 只 用 了 两 次
画 多边 形 的 方 法 , 中 间 那 个 钻 石 就 是 用 copyArea 画 出 来 的 。


加载 现 成 的 图 片


一 帧复 杂 的 图 形 画 面 , 我 们 不 可 能 在 程 序 执 行 时 通 过 调
用 各种 绘 图 方 法 实 时 地 画 出 来 。 大 部 分 的 图 形 都 是 早 在 开 发程 序 前 就 用 其 他
绘 图 软 件 绘 制 好 了 , 程 序 执 行 时 。 直 接把 图 片 加 载 进 来 并 放 在 适 当 的 位 置 。
这 一 节 我 们 将 学 习如 何 使 用 Java 图 形 功 能 在 主 页 里 加 入 各 式 各 样 的 图 片 。
Java 支 持 WWW 上 最 流 行 的 图 象 格 式 --JPEG 和 GIF 。 通 常 JPEG 更适 于 自 然
色 彩 的 图 片 , 如 照 片 , 而 GIF 则 比 较 适 合 装 饰 图片 、 花 边 和 小 动 画 。


首 先来 看 看 Java 如 何 载 入 形 成 的 图 形 文 件 。 其 实 很 简
单 , 只要 给 定 要 加 载 的 图 形 文 件 的 位 置 和 文 件 名 , 就 可 以 通 过 getImage 这
个 方 法 来 把 图 片 加 载 到 程 序 中 。 这 里 所 说 的 文件 位 置 不 仅 仅 是 指 文 件 在 本 地
硬 盘 的 存 放 路 径 , Java 程序 还 可 以 根 据 指 定 的 URL , 直 接 加 载 网 络 上 的 图
形 文 件 ,也 就 是 说 加 载 的 图 形 可 以 在 本 机 硬 盘 上 , 也 可 以 在 网 络上 。 对 于 编
程 者 而 言 , 两 者 的 使 用 一 样 简 单 。


在 Applet 中 加 载 图 片 就 不 得 不 使 用 Image 这 个 类 , 和
前 面 用 过 的 许多 类 一 样 , Image 也 在 java.awt 程 序 包 里 。 所 以 , 如 果 要 编写
一 个 包 含 有 图 片 的 Applet , 就 应 该 记 住 在 程 序 开 头 加 上这 句 话 :

      import java.awt.Image;

写 上 这 句 话 就 可 以 用 getImage 来 加 载 图 片 了。 其 标 准 格
式 为 :

      Image getImage ( URL url );

      Image getImage ( URL url , String name );

      URL 是 Uniform Resource Locator ( 统 一 资源 定
位 器 ) 的 缩 写 , 它 是 WWW 上 用 来 指 示 Internet 信 息 资 源位 置 的 方 法 。 Java
定 义 的 URL 对 象 指 定 了 一 个 网 络 资 源 的位 置 。 getImage 方 法 返 回 一 个 Image
对 象 。 当 然 , 我 们 可 以把 文 件 名 及 其 位 置 整 个 看 做 一 个 URL 对 象 来 指 示 所 要
加 载的 图 形 文 件 。 这 种 情 况 就 采 用 第 一 种 格 式 。 同 样 也 可 以用 图 形 文 件 的 位
置 和 文 件 名 分 别 指 定 它 , 可 见 第 二 种 格式 就 是 这 样 做 的 。 例 如 :

      Image getImage ( "http://xxx . yyy .
edu /Applet / classes / Image1.gif ");

      Image getImage ( "file:/D:/image/ ” ,
" example.gif " );





显示 图 形


加 载了 图 形 , 怎 样 把 它 按 要 求 在 程 序 里 显 示 出 来 呢 ? Graphics
类 里 提 供 了 drawImage 这 个 方 法 把 Image 对 象 在 程 序 里 绘 制 出来 。 如 果 只 是
按 原 样 显 示 图 形 , 就 可 以 这 样 写 :

      g.drawImage ( picture , x , y , this );

其 中 picture 是 一 个 Image 对 象 , (x , y) 是 图 形的 坐 标
, this 指 的 是 g 这 个 Graphics 对 象 。


现 在看 到 的 图 象 已 经 相 当 不 错 了 , 不 过 我 们 还 可 以 在 图
形 显示 时 增 加 一 些 有 趣 的 处 理 。 你 可 以 改 变 图 形 的 背 景 , 还可 以 任 意 缩 放 图
形 。 看 下 面 这 两 条 语 句 就 是 这 样 做 的 :

      g.drawImage ( picture , x, y, clr , this );

      g.drawImage ( picture , x, y, width, height
, this );

其 中 clr 指 定 了 显 示 图 片 的 背 景 色 , width 和 height 指
定 了 图 片 输 出 的 大 小 。


* 设 置 图 片 的 背 景 色 效 果 时 , 只 有 图 片 具有 透 明 属 性 才
能 看 得 出 来 , 如 果 设 置 了 底 色 , 而 不 显 示, 说 明 你 所 加 载 的 图 片 是 不 透 明 的


讲 了 这 么 多 , 编 个 程 序 看 看 吧 !

程 序 16.5

  1.     import java.awt.Image;

  2.       import java.awt.Graphics;

  3.       import java.awt.Color;

  4.       public class picture extends java.applet.Applet

  5.       {

  6.           Image picture1,picture2; // 定 义 两 个 Image
  7. 类 型 的 对 象

  8.           public void init( ) // 加 载 图 片 ,把 sunjava.gif
  9. 加 载 到 picute1 , window.jpg 加 载 到 picture2

  10.           {

  11.             picture1 = getImage(getDocumentBase(
  12. ),"sunjava.gif");

  13.             picture2 = getImage(getDocumentBase(
  14. ),"window.jpg");

  15.           }

  16.           public void paint(Graphics g)

  17.           {

  18.             g.drawImage(picture1,0,0,this); // 以
  19. ( 0 , 0 ) 为 左 上 角 按 原 样 显 示 picture1

  20.               // 以 ( 0 , 240 ) 为 左 上 角, 将 picture1
  21. 拉 伸 到 200 × 100 , 然 后 再 显 示

  22.             g.drawImage(picture1,0,240,200,100,this);

  23.             g.drawImage(picture2,220,0, this); //
  24. 以 ( 220 , 0 ) 为 左 上 角 按 原 样 显 示 picture2

  25.           }

  26.       }
复制代码

      该 程 序 的 HTML 文 件 如 下 所 示 :
  1. < HTML>

  2. < HEAD>

  3. < TITLE>picture< /TITLE>

  4. < /HEAD>

  5. < BODY>

  6. < APPLET CODE = "picture.class" WIDTH
  7. = 500 HEIGHT = 400>< /APPLET>

  8. < /BODY>

  9. < /HTML>
复制代码


编 辑完 以 后 , 顺 利 通 过 编 译 就 可 以 运 行 了 , 运 行 结 果 如
图 16.8 所 示 :



图 16.8 程 序 16.5 运 行 结 果


这 里 请 大 家 注 意 加 载 图 片 的 这 两 条 语 句

      picture1 = getImage(getDocumentBase( ),"sunjava.gif");

      picture2 = getImage(getDocumentBase( ),"window.jpg");


其 中 getDocumentBase( ) 给 出 了 包 含 这 个 Applet 的
HTML 的 URL , 这 是什 么 意 思 呢 ? 也 就 是 说 它 指 明 了 你 的 Java 程 序 在 主 机 上存
放 的 位 置 , 按 照 这 个 路 径 , 系 统 才 能 找 到 你 所 加 载 的图 片 。


为 什么 要 用 getDocumentBase( ) 呢 ? 我 直 接 告 诉 它 不
就 行 了 吗 ? 可是 你 想 过 没 有 , 如 果 你 把 整 个 目 录 树 挪 了 地 方 , 而 不 修改 程 序
里 的 路 径 , 系 统 还 能 按 你 所 给 的 绝 对 路 径 找 到 图片 吗 ? 当 然 不 能 。 所 以 这 里
用 了 getDocumnetBase( ), 这 样 你就 可 以 放 心 地 挪 动 你 的 目 录 , 而 无 需 每 挪
一 次 就 去 修 改程 序 。 不 论 你 怎 么 移 动 目 录 getDocumentBase( ) 总 能 找 到 那
个包 含 了 Java 程 序 的 HTML , 找 到 它 我 们 就 可 以 按 相 对 路 径 找到 所 要 加 载 的
图 片 。


* 我 实 在 不 想 去 考 虑 什 么 目 录 树 、 路 径 这些 难 缠 的 问 题
, 我 想 就 像 程 序 里 那 样 在 getDocumentBase( ) 后面 直 接 写 图 片 文 件 的 文 件
名 。 好 主 意 ! 想 那 样 做 很 容 易, 你 只 需 要 把 那 个 图 片 文 件 和 包 含 了 这 个 Applet
的 HTML 文件 放 在 同 一 个 目 录 下 就 行 了 。


小 结




这 一章 的 学 习 到 此 就 结 束 了 , Java 多 姿 多 彩 的 图 形 效
果 为 你的 主 页 增 色 不 少 。 总 结 一 下 本 章 所 讲 述 的 内 容 , 我 们 在这 一 章 里 学 习
了 :




用 各 种 丰 富 的 绘 图 指 令 画 出 线 、 矩 形 、 椭 圆、 弧 、 多
边 形 等 各 式 各 样 的 图 形 。

drawLine 用 来 画 线 , drawRect 和 fillRect 画 的 是
空心 和 实 心 的 矩 形 , drawRoundRect 和 fillRoundRect 是 画 圆 角 矩 形的 方
法 , 可 以 用 fill3Drect 画 出 具 有 3 维 立 体 效 果 的 矩 形 ,当 然 也 可 以 完 全
自 己 画 。

用 drawOral 和 fillOral 画 空 心 和 实 心 的 椭 圆 , drawArc
可 以 画 一 段 弧 , fillArc 画 的 是 一 个 扇 形 , drawPolygon 和 fillPolygon
是 画 多 边 形 的 两 种 方 法 。

用 getImage 在 Java Applet 中 加 载 现 成 的 图 形 , 你不
仅 可 以 自 己 在 程 序 中 画 图 , 还 能 够 利 用 别 的 图 形 处 理专 业 软 件 为 你 的 程 序
作 出 精 美 的 图 片 , 然 后 直 接 加 载 到程 序 中 。

加 载 了 图 片 靠 drawImage 把 它 显 示 出 来 。


学 习 完本 章 , 可 以 在 主 页 里 加 入 各 种 栩 栩 如 生 的 图 片 了 ,
美 中不 足 的 是 它 们 都 是 静 态 的 , 试 想 一 下 , 主 页 里 的 图 形 动起 来 , 能 够 用 鼠 标
、 键 盘 控 制 该 会 多 么 令 人 振 奋 。 接 着学 习 以 后 的 两 章 , 你 就 能 够 通 过 自 己 的 努
力 实 现 这 个 愿望 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:50:16 | 显示全部楼层

第十五讲 交互效果(一)

教 学 纲 要


有 了 Java , 你 和 Homepage 的 交 互 不 仅 仅 是 点 击 某 个 字
、 按 钮 或者 图 , 它 切 换 成 下 一 页 。 Java 为 浏 览 Homepage 的 用 户 提 供了 地 地
道 道 的 交 互 。 包 含 了 Java 程 序 的 Homepage 知 道 你 需要 它 做 什 么 , 而 不 是 简
简 单 单 地 切 换 到 下 一 页 。 你 一 定认 为 这 是 理 所 当 然 的 , 可 是 没 有 Java 以 前
, 事 情 可 没 这么 简 单 。
________________________________________

交互 的
Java 世 界




·鼠 标 引 发 的 各 种 事 件  

·编 写 自 己 的 事 件 处 理 代 码  

·键 盘 引 发 的 事 件  

·在 Internet 上 实 现 与 程 序 的 实 时 交 互


也 许 你要 问 “ Java 怎 么 知 道 我 点 了 鼠 标 ? 按 了 哪 个 键 ? ”
它 当然 知 道 。 你 对 鼠 标 或 键 盘 的 如 何 操 作 对 Java 而 言 都 称 之为 “ 事 件 ” , 例 如
: 移 动 鼠 标 , 点 击 鼠 标 , 按 下 某 个 按键 … … 。 这 些 事 件 发 生 了 以 后 , 系 统 就 会
通 知 Java 去 处理 , 就 好 比 你 按 了 门 铃 , 让 主 人 来 为 你 开 门 一 样 。 在 这一 章 里 ,
你 将 学 会 编 写 这 种 交 互 式 的 程 序 来 响 应 鼠 标 和键 盘 的 输 入 , 让 Java 干 你 想 让
它 干 的 事 情 。 你 可 以 让 它告 诉 你 当 前 鼠 标 所 处 的 位 置 , 拖 动 鼠 标 画 你 想 画 的 东
西, 或 者 用 键 盘 控 制 Homepage 中 图 形 的 位 置 , 甚 至 可 以 编 一个 由 鼠 标 控 制 的 小
游 戏 。


你 对 鼠 标 做 了 什 么




你 对鼠 标 所 做 的 任 何 操 作 , 系 统 都 会 产 生 一 个 所 谓 “ 事
件 ” 通 知 Java 。 如 果 鼠 标 被 按 下 , Java 将 得 到 一 个 来 自 系 统 的通 知 --MOUSE_DOWN
。 那 么 释 放 鼠 标 , 是 不 是 就 是 MOUSE_UP 呢 ?没 错 , 就 是 这 样 。 可 是 鼠 标 通
常 都 有 两 、 三 个 按 键 , Java 怎 么 知 道 我 按 的 是 哪 一 个 呢 ? 不 用 担 心 , Java
对 所 有 的鼠 标 按 键 都 一 视 同 仁 , 只 要 你 按 了 键 , MOUSE_DOWN 事 件 就产 生 , 不
管 按 的 是 哪 一 个 。


对 鼠标 的 操 作 可 不 仅 仅 是 按 下 或 释 放 , 其 实 用 的 最 多 的
还 是移 动 鼠 标 。 一 旦 你 移 动 了 鼠 标 , Java 就 会 从 系 统 那 里 得到 一 个 MOUSE_MOVE
的 通 知 。 鼠 标 移 动 还 有 另 一 种 方 式 , 那就 是 拖 动 , 它 和 移 动 有 什 么 不 同 呢 ?
移 动 时 并 未 按 鼠 标按 键 , 它 产 生 的 事 件 是 MOUSE_MOVE 。 如 果 你 移 动 鼠 标 的
同时 还 按 住 了 鼠 标 按 键 , 这 就 是 拖 动 , 它 产 生 的 事 件 将 不再 是 MOUSE_MOVE ,
而 是 MOUSE_DRAG 了 。


Java Applet 对 鼠 标 的 动 作 可 以 非 常 敏 感 , 只 要 鼠 标
进 入 Applet 窗 口 的 范 围 , 它 就 会 有 所 反 应 , 这 是 通 过 MOUSE_ENTER 实 现的
, MOUSE_ENTER 表 示 鼠 标 指 针 进 入 到 Applet 的 范 围 , 反 之 , MOUSE_EXIT
就 是 鼠 标 离 开 时 产 生 的 事 件 了 。


你 也许 要 奇 怪 了 , “ 前 面 编 了 这 么 多 Java 程 序 , 我 对
鼠 标 作 了这 么 多 操 作 , 怎 么 都 没 有 反 应 呢 ? ” 当 然 不 会 有 反 应 !因 为 系 统 虽
然 通 知 了 Java , 鼠 标 做 了 什 么 , 键 盘 被 按 了哪 个 键 , 可 是 Java 并 没 有 告 诉
系 统 , 鼠 标 或 键 盘 动 作 了 以后 应 该 作 何 反 应 。 就 好 像 门 铃 响 了 , 你 知 道 去 开
门 ; 电话 铃 响 了 , 应 该 接 电 话 。 我 们 也 可 以 通 过 自 己 编 写 的 Java 程 序 , 告
诉 系 统 对 鼠 标 、 键 盘 的 操 作 做 出 相 应 的 反 应 。




鼠 标 被 按 下 了




我 们在 上 一 节 已 经 知 道 鼠 标 被 按 下 会 产 生 应 该 叫 MOUSE_DOWN
的事 件 , 如 果 你 想 在 鼠 标 按 下 时 做 点 儿 什 么 , 就 应 该 把 你想 做 的 事 情 写 到 mouseDown
这 个 方 法 中 去 , 那 么 一 旦 鼠 标 被按 下 , 系 统 就 会 去 执 行 你 在 mouseDown 这 个
方 法 里 让 它 做 的事 情 。 mouseDown 的 写 法 是 这 样 的 :

    public boolean mouseDown ( Event evt , int x
, int y ) { … }


你 打算 在 鼠 标 按 下 后 做 的 事 情 就 填 在 { } 里 , 这 样 一 来
, 只 要鼠 标 被 按 下 了 , 系 统 自 己 就 会 去 调 用 mouseDown , 做 你 让 它做 的 事 情



这 里的 参 数 都 是 什 么 意 思 呢 ? evt 表 示 一 个 事 件 , 在 这
个 方 法里 它 表 示 “ 鼠 标 按 下 ” 这 个 事 件 。 它 前 面 的 Event ( 事 件) 说 明 了 evt
是 个 事 件 类 型 的 对 象 。 x 和 y 是 evt 这 个 事 件发 生 时 鼠 标 的 坐 标 , 也 就 是 你
击 鼠 标 的 位 置 。 boolean 又 是什 么 呢 ? 它 表 示 mouseDown 这 个 方 法 的 返 回 值
类 型 是 一 个 布尔 类 型 的 值 。 怎 么 越 讲 越 糊 涂 了 呢 ? 其 实 , 你 也 不 要 太在 意 。
如 果 你 对 “ 鼠 标 按 下 ” 这 一 事 件 进 行 了 处 理 , 就尽 管 返 回 “ true " (
是 ) 好 了 。


一 样的 道 理 , 我 们 知 道 松 开 鼠 标 产 生 的 事 件 是 MOUSE_UP
, 如 果你 想 处 理 “ 释 放 鼠 标 ” 这 个 事 件 , 就 把 程 序 写 在 mouseUp 这 个 方 法 里
。 它 的 写 法 和 mouseDown 很 类 似 ,

    public boolean mouseUp ( Event evt , int x ,
int y ) { … }

不 同 的 是 这 里 的 evt 所 代 表 的 就 不 是 “ 按 下鼠 标 ” 而 是 “
释 放 鼠 标 ” 了 。 一 般 情 况 下 , 我 们 只 关 心 “ 按 下 鼠 标 ” 这 一 事 件 , 至 于 是
否 “ 释 放 鼠 标 ” 就 不 需要 理 会 了 。





好 啦! 先 来 编 个 程 序 处 理 一 下 “ 按 下 鼠 标 ” 这 个 事 件 , 亲 自体 验 体 验 交 互 式
程 序 到 底 怎 么 回 事 。 这 个 程 序 会 在 你 点鼠 标 的 位 置 上 显 示 一 个 小 红 叉 , 并 告
诉 你 这 个 小 叉 的 位置 , 以 及 这 是 第 几 个 小 叉 。

程 序 17.1

   
  1. // mouse.java

  2.     import java.awt.Graphics;

  3.     import java.awt.Event;

  4.     import java.awt.Color;

  5.     public class mouse extends java.applet.Applet

  6.     {

  7.         int num = 0;                // 设置 计 数 器 的 初 值

  8.         int px,py;

  9.         public boolean mouseDown(Event evt,int x,int y)     // “
  10. 鼠 标 按 下 ” 处 理         {    px = x;       // 取 得 按 下 鼠 标 时 的 坐 标

  11.             py = y;

  12.             num++;        // 计 数 器 加 1

  13.             repaint( );    // 重 画 窗 口

  14.             return true;    // 返 回 true ,表 明 事 件 处 理 过 了

  15.         }

  16.         public void update(Graphics g)

  17.         {

  18.             g.setColor(getBackground( ));    // 用 背 景 色 刷 出 一 块
  19. 区 域

  20.             g.fillRect(10,300,200,60);

  21.             paint(g);                // 调 用 paint( ) 方 法

  22.         }

  23.         public void paint(Graphics g)

  24.         {

  25.             g.setColor(Color.green);    // 设置 当 前 画 笔 为 绿 色

  26.             g.drawString("The location of mark is ("+px+","+py+")",10,320);

  27.             g.drawString("This is NO."+num+" point",10,340);  
  28. // 输 出 点 鼠 标 时 的 坐 标 值 和 点 鼠 标 的 次 数

  29.             g.setColor(Color.red);    // 在 点了 鼠 标 的 位 置 画 一 个 小
  30. 红 叉

  31.             g.drawLine(px-5,py-5,px+5,py+5);

  32.             g.drawLine(px+5,py-5,px-5,py+5);

  33.         }

  34.     }
复制代码

程 序 mouse.java 的 HTML 文 件 如 下 所 示

  1. < HTML>

  2. < HEAD>

  3. < TITLE>mouse< /TITLE>

  4. < /HEAD>

  5. < BODY>

  6. < APPLET CODE = "mouse.class" WIDTH = 300 HEIGHT =
  7. 350>< /APPLET>

  8. < /BODY>

  9. < /HTML>
复制代码

这 个 程 序 的 运 行 结 果 如 图 17.1 所 示 。



图 17.1 程 序 17.1 的 运 行 结 果


你 看, 我 们 在 这 个 Java Applet 的 运 行 窗 口 里 用 小 叉 画 了 一 个 北斗 星 座 。
只 要 程 序 还 在 运 行 , 你 在 这 个 Java Applet 里 所 做的 任 何 一 个 点 鼠 标 操 作 都
会 被 它 用 小 红 叉 记 录 下 来 , 并且 告 诉 你 点 中 的 位 置 。 试 一 试 , 是 不 是 很 有 趣
呢 ?


运 行完 程 序 , 我 们 再 来 看 看 程 序 里 一 些 应 该 注 意 的 地 方 。


1.public boolean mouseDown ( Event evt , int x , int y ) { … …
}


这 就是 处 理 鼠 标 按 下 这 一 事 件 的 方 法 , 一 旦 鼠 标 被 按 下 , 系统 就 会 自 动 去
调 用 它 , 取 得 鼠 标 按 下 时 的 位 置 , 并 把 计数 器 加 1 , 然 后 调 用 repaint 重 画
画 面 , 最 后 返 回 true , 告诉 系 统 “ 鼠 标 按 下 ” 这 一 事 件 已 经 处 理 完 毕 。


这 个程 序 中 , 我 们 用 了 两 个 以 前 从 来 没 有 用 过 的 类 : java.awt.Point 和
java.awt.Event 。 Point 对 象 用 坐 标 ( x , y ) 来 表 示 一 个 点。 Event 就
是 本 章 的 主 角 — — 事 件 类 。 今 后 凡 是 和 鼠 标 、键 盘 打 交 道 的 程 序 开 始 必 须 写
这 句 话 。  


2.import java.awt.Event ;

有 一个 update 方 法 你 可 能 从 来 没 见 过 。 update 的 意 思 就 是 “ 更新 ” 。 其 实
每 次 系 统 调 用 repaint 的 时 候 , repaint 就 自 动 先去 调 用 update , 然 后 再
调 用 paint 在 纸 上 画 画 , 这 就 是 repaint 的 调 用 过 程 。 系 统 缺 省 的 update
是 用 背 景 色 把 全 部 输 出 窗口 都 刷 一 遍 。 可 是 这 个 程 序 里 , 我 们 想 保 留 每 次 画
的 小叉 , 唯 一 需 要 更 新 的 是 下 面 的 输 出 信 息 , 所 以 我 们 按 照自 己 的 需 要 改 写
了 update , 只 让 它 更 新 写 字 的 区 域 , 而 把画 小 叉 的 区 域 保 留 不 变 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
 楼主| 发表于 2006-3-3 08:54:21 | 显示全部楼层

第十六讲 交互效果(二)

教 学 纲 要


有 了 Java , 你 和 Homepage 的 交 互 不 仅 仅 是 点 击 某 个 字
、 按 钮 或者 图 , 它 切 换 成 下 一 页 。 Java 为 浏 览 Homepage 的 用 户 提 供了 地 地
道 道 的 交 互 。 包 含 了 Java 程 序 的 Homepage 知 道 你 需要 它 做 什 么 , 而 不 是 简
简 单 单 地 切 换 到 下 一 页 。

·拖 一 拖 鼠 标

·编 个 胆 小 鬼 的 程 序
——————————————————————————————

拖 一 拖 鼠 标




移 动鼠 标 是 我 们 最 常 用 的 鼠 标 操 作 。 移 动 鼠 标 有 两 种 方
式 :一 种 是 单 纯 的 移 动 鼠 标 , 没 有 别 的 动 作 。 另 一 种 是 移 动鼠 标 的 同 时 按 住
鼠 标 按 键 。 当 然 , 不 论 你 按 住 的 是 哪 个键 , , 对 Java 而 言 没 有 什 么 区 别 。
这 两 种 移 动 鼠 标 的 方式 将 会 引 发 不 同 的 事 件 , 前 者 产 生 的 事 件 叫 MOUSE_MOVE,
而后 一 种 将 产 生 MOUSE_DRAG 事 件 。 如 果 要 对 这 两 个 事 件 进 行进 一 步 处 理 , 让
计 算 机 在 你 移 动 或 拖 动 鼠 标 时 , 做 一 些你 希 望 它 做 的 事 情 , 那 么 你 就 应 该 把
事 情 交 代 给 mouseDown 或 mouseDrag 。 它 们 的 写 法 和 mouseDown 和 mouseUp
非 常 相 似 , 除了 名 字 不 同 以 外 , 其 他 都 一 样 。

    public boolean mouseMove ( Event evt , int x
, int y ) { … }

    public boolean mouseDrag ( Event evt , int x
, int y ) { … }


在 前面 的 学 习 中 你 已 经 学 会 怎 么 处 理 鼠 标 事 件 了 , 这 一
节 里的 事 件 处 理 也 是 一 样 的 。 把 你 想 让 Java 做 的 事 情 写 到 { … } 里 就 行 了
。 让 我 们 实 验 一 下 , 这 两 个 方 法 会 在 Java Applet 窗 口 里 产 生 什 么 效 果 。

程 序 17.2

   
  1. // MouseMove.java

  2.     import java.awt.Graphics;

  3.     import java.awt.Point;

  4.     import java.awt.Event;

  5.     import java.awt.Color;

  6.     public class dragmouse extends java.applet.Applet

  7.     { Point CurrentPoint = new Point(0,0);    //
  8. 初 始 化 点 的 坐 标 和 输 出 消 息

  9.       String CurrentMessage = " ” ;


  10.       public boolean mouseDrag(Event evt, int x,
  11. int y)    // “ 拖 动 鼠 标 ” 事 件 处 理

  12.       { CurrentPoint.x = x ;        // 获 得 当前 鼠
  13. 标 位 置

  14.         CurrentPoint.y = y ;

  15.         CurrentMessage = "you are painting
  16. on: ("+ x + ","+ y + ")" ;  // 更 新 输 出
  17. 消 息

  18.         repaint( ) ;            // 重 画 窗口

  19.         return true;

  20.       }


  21.       public boolean mouseMove(Event evt, int x,
  22. int y)  // “ 移 动 鼠 标 ” 事 件 处 理

  23.       { CurrentMessage = "you are moving on
  24. (" + x + ", " + y + ")"; // 更 新 输 出 消 息

  25.         repaint( );        // 重 画 窗 口

  26.         return true;

  27.       }


  28.       public void update(Graphics g)

  29.       { g.setColor(getBackground( ));        //
  30. 清 除 输 出 消 息 的 区 域

  31.         g.fillRect(0,0,200,20);

  32.         paint(g);

  33.       }


  34.       public void paint(Graphics g)

  35.       { g.setColor(Color.blue);   // 设 置 当 前画 笔
  36. 为 蓝 色

  37.         g.drawString(CurrentMessage, 5, 15);   //
  38. 输 出 鼠 标 位 置 信 息

  39.         g.drawLine(CurrentPoint.x,CurrentPoint.y,CurrentPoint.x,CurrentPoint.y);
  40.     // 在 鼠 标 拖 过 的 位 置 画 点

  41.         }

  42.     }
复制代码

程 序 17.2 的 HTML 文 件 是 如 下 所 示 :

< HTML>

< HEAD>

< TITLE>dragmouse< /TITLE>

< /HEAD>

< BODY>

< APPLET CODE = "dragmouse.class" WIDTH
= 300 HEIGHT = 200>< /APPLET>

< /BODY>

< /HTML>


这 个程 序 里 包 含 了 两 个 事 件 处 理 , 当 你 移 动 鼠 标 时 , 系
统 调用 的 是 mouseMove 这 个 事 件 处 理 , 拖 动 鼠 标 时 调 用 的 又 是 mouseDrag 这
个 事 件 处 理 。 运 行 这 个 程 序 , 也 许 你 已 经 试 过 了 , 可以 用 拖 动 鼠 标 来 画 图 。


啊 哈! 那 就 让 它 运 行 起 来 看 看 什 么 样 子 。 在 Applet 运
行 窗 口 里移 动 鼠 标 , 提 示 行 告 诉 你 当 前 鼠 标 的 位 置 。 拖 一 拖 鼠 标呢 ? 按 住 鼠
标 按 键 拖 动 鼠 标 , 你 可 以 随 心 所 欲 地 在 Applet 窗 口 里 画 图 了 。 那 么 就 画 点
儿 什 么 吧 ! 来 杯 咖 啡 怎 么 样? 好 主 意 !



图 17.2 程 序 17.2 的 运 行 结 果







编 个 胆 小 鬼 的 程 序




移 动鼠 标 除 了 会 产 生 MOUSE_MOVE 和 MOUSE_DRAG 事 件 外
, 还 会 产 生 另外 的 两 个 事 件 , 你 可 能 意 识 不 到 , 不 过 它 们 的 确 产 生 了。 那 就
是 MOUSE_ENTER 和 MOUSE_EXIT 。 顾 名 思 义 , MOUSE_ENTER 就是 鼠 标 进 入 到
Applet 窗 口 范 围 之 内 , 而 MOUSE_EXIT 就 是 鼠 标离 开 Applet 窗 口 。 如 果 你
想 让 你 的 Java 程 序 对 鼠 标 的 进 进出 出 有 所 反 应 的 话 , 就 应 该 到 方 法 mouseEnter
和 mouseExit 里面 去 处 理 。 这 两 个 方 法 的 写 法 也 和 前 面 的 一 样 , 仅 仅 在名 字
上 有 所 区 别 。

    public boolean mouseEnter ( Event evt , int
x , int y ) { … }

    public boolean mouseExit ( Event evt , int x
, int y ) { … }


好 啦, 我 已 经 等 不 及 要 给 你 们 看 一 个 有 趣 的 程 序 了 , 这
个 程序 里 藏 着 一 个 胆 小 鬼 , 他 害 怕 老 鼠 。

程 序 17.3

  1. // coward.java

  2. import java.awt.* ;

  3. public class coward extends java.applet.Applet

  4. {

  5.   String CurrentMessage = " ";     //
  6. 初 始 化 输出 消 息

  7.   Image face;                // 定 义 一 个 Image 对
  8. 象 名 为 face

  9.   public boolean mouseEnter(Event evt, int x, int
  10. y)   // “ 鼠 标 进 入 ” 事 件 处 理

  11.   {

  12.     CurrentMessage = "HA !!! There is a mouse.
  13. I am afraid of mouse.";   // 输 出 消 息

  14.     face = getImage (getDocumentBase( ),"frighten.gif");  
  15. // 加 载 害 怕 时 的 图 片

  16.     repaint( );

  17.     return true;

  18.   }


  19.   public boolean mouseExit(Event evt, int x, int
  20. y)   // “ 鼠 标 离 开 ” 事 件 处 理

  21.   { CurrentMessage = "OK ! It's gone . I am
  22. horrified."; // 输 出 消 息

  23.     face = getImage (getDocumentBase( ),"happy.gif");
  24. // 加 载 高 兴 时 的 图 片

  25.     repaint( );

  26.     return true;

  27.   }

  28.   public void paint(Graphics g)

  29.   { Font fn = new Font("TimesRoman",Font.BOLD
  30. , 20 );   // 设 置 当 前 字 体

  31.     g.setFont (fn);

  32.     g.drawString(CurrentMessage, 10, 230);      
  33.     // 显 示 消 息

  34.     g.drawImage(face,100,0,this);              
  35. // 显 示 图 片

  36.   }

  37. }
复制代码

程 序 17.3 的 HTML 文 件 是 如 下 所 示 :


< HTML>

< HEAD>

< TITLE>coward< /TITLE>

< /HEAD>

< BODY>

< APPLET CODE = "coward.class" WIDTH
= 400 HEIGHT = 250>< /APPLET>

< /BODY>

< /HTML>


这 个程 序 刚 开 始 运 行 的 时 候 是 一 个 空 白 窗 口 , 把 你 的 鼠
标 挪到 窗 口 里 来 , 你 看 到 了 什 么 ? 一 个 吓 坏 了 的 胆 小 鬼 ( 图 17.3 ) 。


运 行完 这 个 程 序 , 你 笑 了 吗 ? 如 果 笑 了 , 这 就 对 了 。 说
明 你已 经 开 始 体 会 到 Java 带 给 你 的 乐 趣 了 。 继 续 努 力 , 好 戏还 在 后 头 呢 !



图 17.3 程 序 17.3 运 行 结 果 之 一


好 啦, 别 再 吓 唬 它 了 , 把 你 的 鼠 标 挪 开 吧 。 你 看 它 笑 了
( 图 17.4 ) 。



图 17.4 程 序 17.3 运 行 结 果 之 二

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

2345