BBS水木清华站∶精华区
发信人: zixia (独守空房の比特仙子), 信区: Java
标 题: 来自 JAVA 的传说14.1
发信站: BBS 水木清华站 (Tue May 12 20:59:11 1998)
来 自 Java 的 传 说 (14)
作者 : 清 华 大 学 教 授 : 王 克 宏
教 学 纲 要
你 现 在 已 经 可 以 在 Java 程 序 里 写 各 种 各 样 的 字 了 , 那 么 有
没 有 想 过 再 加 点 图 形 , 让 你 的 主 页 看 上 去 更 加 优 美 呢 ? 这 一 节
我 们 将 继 续 学 习 如 何 使 用 Graphics 类 提 供 的 各 种 绘 图 方 法 , 发 挥
你 的 创 造 力 , 画 出 漂 亮 的 图 形 。
多 边 形
能 够 画 矩 形 、 椭 圆 和 弧 似 乎 还 不 能 满 足 作 图 的 需 要 。 这 一 节 里
将 介 绍 多 边 形 的 绘 图 方 法 , 而 实 际 上 绘 制 多 边 形 就 是 给 定 两 组
坐 标 , 一 组 x 坐 标 , 一 组 y 坐 标 , 按 顺 序 将 给 定 的 这 一 组 坐 标 连
接 起 来 就 可 以 绘 出 一 个 多 边 形 , 绘 制 多 边 形 的 基 本 方 法 格 式 如
下 :
drawPolygon ( int x[ ], int y[ ], int n )
fillPolygon ( int x[ ], int y[ ], int n )
这 两 个 方 法 中 , 参 数 中 x[ ] 、 y[ ] 分 别 是 多 边 形 顶 点 的 x 坐 标
和 y 坐 标 , n 表 示 多 边 形 的 顶 点 数 。 drawPolygon 并 不 能 自 动 形 成
封 闭 区 域 , 所 以 要 绘 制 封 闭 多 边 形 , 必 须 确 保 第 一 个 顶 点 和 最
后 一 个 顶 点 坐 标 相 同 。 fillPolygon 则 无 需 这 样 做 。
如 果 想 在 图 中 的 另 一 个 区 域 画 一 个 同 样 的 多 边 形 , 你 会 怎
么 做 呢 ? 重 复 前 面 的 每 一 条 指 令 , 并 修 改 每 个 点 的 坐 标 。 哦 !
可 千 万 别 那 样 做 。 现 在 就 介 绍 一 种 可 以 轻 轻 松 松 解 决 这 个 问 题
的 方 法 --copyArea 。 其� 样 做 的 。 例 如 :
Image getImage ( "http://xxx . yyy . edu /Applet / classes / Image1.gif ");
Image getImage ( "file:/D:/image/ ” , " example.gif " );
标 准 格 式 如 下 :
copyArea ( int x0 , int y0 , int width , int height , int x1 , itn y1 )
前 面 的 四 个 参 数 应 该 都 很 熟 悉 了 , 它 们 指 定 了 要 复 制 的 矩
形 区 域 , 最 后 两 个 参 数 表 示 所 要 复 制 的 区 域 距 原 位 置 的 x 、 y 偏
移 量 。 当 x1 和 y1 为 负 , 复 制 到 原 位 置 的 左 边 或 上 边 。 反 之 若 x1
和 y1 为 正 , 则 复 制 到 右 边 和 下 边 。
你 想 试 试 这 个 方 法 有 多 好 用 吗 ? 试 试 下 面 的 程 序 吧
程 序 16.4 // poly.java
import java.awt.Graphics;
import java.awt.Color;
public class poly extends java.applet.Applet
{ int poly1_x[ ] = {10,20,80,90,50,10}; // 指 定 第 一 个 多 边 形 的 x 、 y 坐
标
int poly1_y[ ] = {20,10,10,20,60,20};
int poly1_L url );
Image getImage ( URL url , String name );
URL 是 Uniform Resource Locator ( 统 一 资 源 定 位 器 ) 的 缩 写
, 它 是 WWW 上 用 来 指 示 Internet 信 息 资 源 位 置 的 方 法 。 Java 定 义
的 URL 对 象 指 定 了 一 个 网 络 资 源 的 位 置 。 getImage 方 法 返 回 一 个
Image 对 象 。 当 然 , 我 们 可 以 把 文 件 名 及 其 位 置 整 个 看 做 一 个
URL 对 象 来 指 示 所 要 加 载 的 图 形 文 件 。 这 种 情 况 就 采 用 第 一 种
格 式 。 同 样 也 可 以 用 图 形 文 件 的 位 置 和 文 件 名 分 别 指 定 它 , 可
见 第 二 种 格 式 就 是 誴tnum = 6; // 指 定 第 一 个 多 边 形 的 边 数
int poly2_x[ ] = {110,120,180,190,150,110}; // 指 定 第 二 个 多
边 形 的 x 、 y 坐 标
int poly2_y[ ] = {20,10,10,20,60,20};
int poly2_ptnum = 6; // 指 定 第 二 个 多 边 形 的 边 数
public void paint(Graphics g)
{
g.drawPolygon(poly1_x,poly1_y,poly1_ptnum); // 以 省 缺 的
颜 色 画 第 一 个 多 边 形
g.setColor(Color.pink);
g.fillPolygon(poly2_x,poly2_y,poly2_ptnum); // 用 粉 色 填 充
第 二 个 多 边 形
g.copyArea(108,8,85,60,-50,50); // 把 第 二 个 多 边 形 拷 贝 到
距 原 位 置 向 左 50 , 向 右 50 的 位 置
}
}
该 程 序 的 HTML 文 件 如 下 所 示 :
编 辑 完 以 后 , 顺 利 通 过 编 译 就 可 以 运 行 了 , 运 行 结 果 如 图 16.7
所 示 :
图 16.7 程 序 16.4 运 行 结 果
现 � 这 句 话 就 可 以 用 getImage 来 加 载 图 片 了 。 其 标 准 格 式 为 :
Image getImage ( UR� 图 中 有 三 个 钻 石 形 状 的 多 边 形 , 而 我 们 只 用 了 两 次 画
多 边 形 的 方 法 , 中 间 那 个 钻 石 就 是 用 copyArea 画 出 来 的 。
加 载 现 成 的 图 片
一 帧 复 杂 的 图 形 画 面 , 我 们 不 可 能 在 程 序 执 行 时 通 过 调 用
各 种 绘 图 方 法 实 时 地 画 出 来 。 大 部 分 的 图 形 都 是 早 在 开 发 程 序
前 就 用 其 他 绘 图 软 件 绘 制 好 了 , 程 序 执 行 时 。 直 接 把 图 片 加 载
进 来 并 放 在 适 当 的 位 置 。 这 一 节 我 们 将 学 习 如 何 使 用 Java 图 形
功 能 在 主 页 里 加 入 各 式 各 样 的 图 片 。 Java 支 持 WWW 上 最 流 行 的
图 象 格 式 --JPEG 和 GIF 。 通 常 JPEG 更 适 于 自 然 色 彩 的 图 片 , 如 照
片 , 而 GIF 则 比 较 适 合 装 饰 图 片 、 花 边 和 小 动 画 。
首 先 来 看 看 Java 如 何 载 入 形 成 的 图 形 文 件 。 其 实 很 简 单 ,
只 要 给 定 要 加 载 的 图 形 文 件 的 位 置 和 文 件 名 , 就 可 以 通 过
getImage 这 个 方 法 来 把 图 片 加 载 到 程 序 中 。 这 里 所 说 的 文 件 位 置
不 仅 仅 是 指 文 件 在 本 地 硬 盘 的 存 放 路 径 , Java 程 序 还 可 以 根 据
指 定 的 URL , 直 接 加 载 网 络 上 的 图 形 文 件 , 也 就 是 说 加 载 的 图
形 可 以 在 本 机 硬 盘 上 , 也 可 以 在 网 络 上 。 对 于 编 程 者 而 言 , 两
者 的 使 用 一 样 简 单 。
在 Applet 中 加 载 图 片 就 不 得 不 使 用 Image 这 个 类 , 和 前 面 用
过 的 许 多 类 一 样 , Image 也 在 java.awt 程 序 包 里 。 所 以 , 如 果 要 编
写 一 个 包 含 有 图 片 的 Applet , 就 应 该 记 住 在 程 序 开 头 加 上 这 句
话 :
import java.awt.Image;
写 上
--
爱情来得快去得也快,只有猪肉卷是永恒的.
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.5.75]
BBS水木清华站∶精华区