Java Applet 概 述
Java Applet 程 序 分 為 兩 類
Java 小 程 序(Applet) 和Java 應 用 程 序(Application)
這 兩 類 程 序 是 有 區 別 的
Java Applet 嵌 入 在WWW 的 頁 面
作 為 頁 面 的 組 成 部 分 被 下 載
並 能 運 行 在 實 現Java 虛 機 器(JVM) 的Web 浏 覽 器 中
Java 的 安 全 機 制 可 以 防 止 小 程 序 存 取 本 地 文 件 或 其 他 安 全 方 面 的 問 題
而 一 個Java 應 用 程 序 運 行 於Web 浏 覽 器 之 外
沒 有Applet 運 行 時 的 諸 多 限 制
另 外
兩 者 程 序 設 計 上 的 最 大 區 別 在 於
Java Applet 沒 有 主 程 序
而Java 應 用 程 序 一 定 要 有 主 程 序
在Java 中 每 個applet 都 是 由Applet 的 子 類 來 實 現
開 發 人 員 自 定 義 的applet 通 過 重 載Applet 的 幾 個 主 要 成 員 函 數 完 成 小 應 用 程 序 的 初 始 化
繪 制 和 運 行
這 些 函 數 是init( )
paint( )
start( )
stop( ) 和destory( )
一 個applet 的 生 命 周 期 與Web 頁 面 有 關
當 首 次 加 載 含applet 的 頁 面 時
浏 覽 器 調 用init( ) 方 法
完 成applet 的 初 始 化
然 後 調 用paint( ) 或start( ) 方 法 繪 制 或 啟 動 程 序
當 用 戶 離 開 頁 面 時
浏 覽 器 調 用stop( ) 方 法 停 止 小 程 序 運 行
若 用 戶 關 閉 浏 覽 器 將 使applet 停 止 運 行
浏 覽 器 調 用destory( ) 方 法 終 止
使 小 應 用 程 序 有 機 會 釋 放 其 存 在 期 間 鎖 定 的 資 源
只 要 用 戶 不 關 閉 浏 覽 器
重 新 加 載 頁 面
浏 覽 器 則 只 調 用start( ) 方 法 和paint( ) 方 法 重 新 繪 制 並 運 行 小 程 序
Applet 生 命 周 期 如 圖
所 示
擴 展 小 程 序 基 類 支 持 多 線 程
通 常 情 況 下
設 計 小 程 序 是 為 了 給 主 頁 增 加 交 互 性
使 頁 面 更 加 生 動 活 潑
因 此
那 些 真 正 有 用 小 程 序
如 動 畫
實 時 更 新Internet 服 務 器 信 息 回 取
一 般 娛 樂 等 通 常 都 是 持 續 運 行 的
即 小 程 序 的 邏 輯 主 體 存 在 著 無 限 循 環
這 個 邏 輯 主 體 不 宜 放 在 幾 個 浏 覽 器 調 用 方 法 中
如init( )
paint( )
start( ) 等
這 是 因 為 隱 含 情 況 下
小 程 序 所 有 主 邏 輯 都 采 用 單 一 線 程
當 浏 覽 器 調 用 方 法 中 出 現 死 循 環
則 程 序 控 制 不 返 回
如 果 用 戶 換 到 另 一 個 頁 面 之 後 小 程 序 還 在 運 行
就 會 浪 費 處 理 器 資 源
你 可 以 做 一 個 實 驗
使 用 小 程 序 查 閱 器 運 行 小 程 序
你 會 發 現 查 閱 器 本 身 完 全 停 止 作 用
因 為 它 要 等 到 調 用 函 數 返 回 後
才 能 繼 續 處 理 其 他 事 情( 如 響 應 菜 單)
顯 然
這 個 邏 輯 主 體 必 須 放 在 其 他 地 方
解 決 方 法 是 在 小 程 序 框 架 中 加 入 線 程
把 邏 輯 主 體 放 在 線 程run( ) 方 法 中
只 在 浏 覽 器 調 用 方 法start( ) 中 生 成 線 程
而 在
stop( ) 中 終 止 線 程 運 行
這 樣 當 用 戶 不 查 閱 時 不 會 占 用 處 理 器 資 源
圖
表 示 浏 覽 器
小 程 序 和 線 程 之 間 的 關 系
由 於 浏 覽 器/ 小 程 序/ 線 程 是 所 有 浏 覽 器 都 采 用 的 模 型
而Java
applet
Applet 類 本 身 並 不 支 持 線 程
在 實 際 使 用 中
為 方 便 操 作
我 們 可 以 派 生Applet 類 生 成 一 個 支 持 線 程 的 子 類
今 後 再 編 寫applet 時
就 可 以 直 接 從 子 類 中 派 生
程 序 邏 輯 主 體 放 在run( ) 方 法 中
將 線 程 控 制 隱 藏 起 來
這 個 子 類 如 下
import Java
applet
*;
import Java
awt
*;
class MultiThreadApplet extends Applet implements Runnable {
Thread thisThread;
Public void start( ) { if(thisThread==null) {
thisThread=new Thread(this);
thisThread
start( );{
}
public void stop( ) {
if (thisThread! =null) {
thisThread
stop( );
thisThread=null;}
}
public void run ( ) {}}
由 於run( ) 是 接 口Runnable 的 抽 象 方 法
所 以 在MultiThreadApplet 類 中 也 需 要 進 行 定 義
只 不 過 內 容 為 空
下 面 的 例 子 顯 示 如 何 使 用 這 個 類
程 序 包 含 一 個 無 限 循 環 累 加 操 作
並 將 結 果 顯 示 在 屏 幕 上
import java
awt
*;
public class counter extends MultiThreadApplet{
int Counter;
public void run( ){
while(true){
counter++;
repaint( );}
}
public void paint(Graphics g) {
g
drawString(string
valueof(counter)
);{
}
很 顯 然
這 個 小 程 序 對 線 程 的 操 作 已 被 隱 藏 在Multi ThreadApplet 中
解 決 動 畫 中 的 一 些 問 題
動 畫 的 本 質 就 是 運 動 的 圖 形
一 系 列 連 續 顯 示 的 靜 止 圖 形 會 給 我 們 一 種 連 續 動 畫 的 假 象
只 要 動 畫 速 度 足 夠 快
則 分 散 的 靜 止 圖 形 就 會 合 並 成 一 個 連 續 運 動 的 流 程
繪 制 動 畫 十 分 簡 單
只 需 遵 照 以 下 三 步 即 可
(
) 擦 去 整 個 小 程 序 繪 圖 區
(
) 重 畫 動 畫 背 景
(
) 在 新 的 位 置 繪 制 圖 形
但 是
當 動 畫 連 續 幀 之 間 運 動 和 顏 色 不 連 續 時 就 會 發 生 閃 爍 現 象( 例 子 略)
問 題 出 在 小 程 序 區 的 屏 幕 刷 新 上
有 兩 種 方 法 可 以 防 止 動 畫 閃 爍
第 一 種 方 法 是 只 做 局 部 刷 新
即 每 次 只 擦 除 改 變 的 部 分
例 如
如 果 要 繪 制 一 幅
飛 行 的 星 空
動 畫
每 次 刷 新 操 作
先 擦 去 前 一 位 置 的 星 星
再 在 新 的 位 置 繪 制 一 個
但 是
如 果 動 畫 比 較 復 雜
運 動 部 分 重 疊 較 多
則 局 部 刷 新 操 作 很 繁 瑣 也 影 響 程 序 運 行 速 度
在 這 種 情 況 下
可 以 用 另 外 一 種 方 法( 雙 緩 存) 來 解 決 閃 爍 問 題
它 的 核 心 思 想 是 在 屏 幕 外 完 成 一 幀 的 全 部 動 畫
然 後 把 最 後 繪 制 完 的 幀 顯 示 在 小 程 序 屏 幕 上
過 程 如 圖
所 示
示 例 程 序 如 下
import java
awt
*;
public class Ball extends MultiThreadApplet {
Image ball=null;
Image applet=null;
Graphics appletG
ballG;
Public void run( ){
If(ball= =null){
Applet=createlmage(bounds( )
width
bounds( )
Height);
Ball=create Image(
);
AppletG=applet
getGraphics( );
BallG=ball
getGraphics( );
BallG
setColor(Color
gray);
BallG
drawOral(
); {
For(int x=
;x <400;x++) { Double angle="((double)x)/20;" Int y="(int)(Math.abs(Math.sin(angle))*80);" AppletG.clearRect(0,0,bounds( ).width.bounds( ), Helght); DrawBackground(appletG); AppletG.drawImage(ball,x.80-y,this); This.getGraphics( ).drawImage(applet,0,0,this); Try { Thread.sleep(25); } catch(Exception ignored) {}} } private void drawBackground(Graphics g) { for(int I="0;I" < 1;I++){ g.drawLine(0.i*10,400,I*10); } } }
小 程 序 首 先 用createImage( ) 取 得 與 小 程 序 大 小 完 全 相 同 的 屏 外 圖 形 緩 存, 賦 給 變 量applet, 然 後 得 到 緩 存 的 繪 圖 對 象appletG。tw.WInGwiT.COM 以 後 對 幀 的 刷 新 操 作 過 程都 是 針 對appletG。 這 包 括 清 除 幀、 繪 制 背 景、 在 新 位 置 繪 制 圖 形。最後再用drawImage ( ) 方 法 把 緩 存 復 制 到 小 程 序 的 屏 幕 顯 示 區。 運 行 這 個 小 程 序, 你 會 發 現 動 畫 非 常 平 滑, 不 存 在 閃 爍 現 象。
除 了 閃 爍 之 外, 如 果 動 畫 過 於 復 雜, 幀 速 率 就 可 能 降 低。 若 動 畫 降 到 每 秒20, 幀 是 動 畫 會 出 現 間 斷 現 象 影 響 顯 示 效 果。 因 此 有 必 要 優 化 動 畫 速 度, 下 面 列 出 了 一 些 可 行 的 方 案;(1) 畫 得 盡 可 能 少;(2) 用 較 快 的 繪 圖 算 法;(3) 用 顏 色 循 環 等 技 巧 來 繪 畫 某 一 部 分;(4) 用 圖 案 來 表 示 細 節;(5) 用 定 點 整 數 進 行 三 維 計 算;(6) 用 查 詢 的 預 先 計 算 結 果 來 處 理 復 雜 算 法。
4. 縮 短 小 程 序 裝 入 時 間
真 正 功 能 性 的 小 程 序 本 身 並 不 小, 這 就 意 味 著 小 程 序 從Internet 上 下 載 需 要 花 很 多 時 間。 隨 著 小 程 序 的 普 及, 越 來 越 多 的Internet 頻 帶 被 用 於 從 各 地 的 服 務 器 向 客 戶 端Web 浏 覽 器 傳 送 這 些 小 程 序, 因 此 響 應 時 間 進 一 步 下 降。 為 了 縮 短 小 程 序 下 載 和 裝 入 時 間
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25949.html