第十五讲 交互效果(一)

来源:互联网 发布:网络聊天用语指南 编辑:程序博客网 时间:2024/05/16 08:51
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

教 学 纲 要

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

原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 剑神凤擎天 擎天一棍 一棍擎天 擎天白玉柱架海紫金梁 擎天一柱 戚锦年顾擎天免费阅读 龙展颜和慕容擎天全文 擎旗 擎明 红色可乐 擒狼 擒贼先擒王 擒贼擒王 你擒我愿 擒宠记 天仙榜擒美江湖百花榜 擒爱记 擒龙功 神医擒美录 擒妻记 飞天擒罗 马擒单士 擒狼演员表 活塞擒鹈鹕 欲擒顾纵 欲擒心 反扑兽到擒来 擒拿术 擒拿 擒拿格斗 擒拿手 擒拿格斗术 擒拿术教学 擒拿防身术 擒拿拳 72路擒拿手图解 擒拿格斗一招制敌 鹰爪门擒拿术 陈氏太极32式擒拿 擒爱记删减画面在第几分钟 群主擒爱日记