Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1450693
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:14:21

一起学习

教 学 纲 要

有 了 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
    // 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 , 只 让 它 更 新 写 字 的 区 域 , 而 把画 小 叉 的 区 域 保 留 不 变 。

下载本文示例代码


第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)第十五讲 交互效果(一)
阅读(124) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~