2008年(3500)
分类:
2008-05-04 19:14:21
教 学 纲 要
有 了 Java , 你 和 Homepage 的 交 互 不 仅 仅 是 点 击 某 个 字 、 按 钮 或者 图 , 它 切 换 成 下 一 页 。 Java 为 浏 览 Homepage 的 用 户 提 供了 地 地 道 道 的 交 互 。 包 含 了 Java 程 序 的 Homepage 知 道 你 需要 它 做 什 么 , 而 不 是 简 简 单 单 地 切 换 到 下 一 页 。 你 一 定认 为 这 是 理 所 当 然 的 , 可 是 没 有 Java 以 前 , 事 情 可 没 这么 简 单 。
交互 的 Java 世 界
你 对 鼠 标 做 了 什 么
你 对鼠 标 所 做 的 任 何 操 作 , 系 统 都 会 产 生 一 个 所 谓 “ 事 件 ” 通 知 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
// mouse.java
import java.awt.Graphics;
import java.awt.Event;
import java.awt.Color;
public class mouse extends java.applet.Applet
{
int num = 0; // 设置 计 数 器 的 初 值
int px,py;
public boolean mouseDown(Event evt,int x,int y) // “
鼠 标 按 下 ” 处 理 { px = x; // 取 得 按 下 鼠 标 时 的 坐 标
py = y;
num ; // 计 数 器 加 1
repaint( ); // 重 画 窗 口
return true; // 返 回 true ,表 明 事 件 处 理 过 了
}
public void update(Graphics g)
{
g.setColor(getBackground( )); // 用 背 景 色 刷 出 一 块
区 域
g.fillRect(10,300,200,60);
paint(g); // 调 用 paint( ) 方 法
}
public void paint(Graphics g)
{
g.setColor(Color.green); // 设置 当 前 画 笔 为 绿 色
g.drawString("The location of mark is (" px "," py ")",10,320);
g.drawString("This is NO." num " point",10,340);
// 输 出 点 鼠 标 时 的 坐 标 值 和 点 鼠 标 的 次 数
g.setColor(Color.red); // 在 点了 鼠 标 的 位 置 画 一 个 小
红 叉
g.drawLine(px-5,py-5,px 5,py 5);
g.drawLine(px 5,py-5,px-5,py 5);
}
}
程 序 mouse.java 的 HTML 文 件 如 下 所 示
< HTML>
< HEAD>
< TITLE>mouse< /TITLE>
< /HEAD>
< BODY>
< APPLET CODE = "mouse.class" WIDTH = 300 HEIGHT =
350>< /APPLET>
< /BODY>
< /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 , 只 让 它 更 新 写 字 的 区 域 , 而 把画 小 叉 的 区 域 保 留 不 变 。