您现在的位置:软界网技术中心软件开发Java > 技术显示
第十五讲 交互效果(一)
2001-10-12 0:00:00   网友评论       阅读次数 点此评论
   

教 学 纲 要

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


 
      来源: 作者:
 
【评论查看】
更多关于 第十五讲 交互效果(一)  的技术