熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java Applet 編 程 技 巧

2013-11-23 18:53:38  來源: Java核心技術 

   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( ) 中 終 止 線 程 運 行 這 樣 當 用 戶 不 查 閱 時 不 會 占 用 處 理 器 資 源 表 示 浏 覽 器 小 程 序 和 線 程 之 間 的 關 系
   
   由 於 浏 覽 器/ 小 程 序/ 線 程 是 所 有 浏 覽 器 都 采 用 的 模 型 而JavaappletApplet 類 本 身 並 不 支 持 線 程 在 實 際 使 用 中 為 方 便 操 作 我 們 可 以 派 生Applet 類 生 成 一 個 支 持 線 程 的 子 類 今 後 再 編 寫applet 時 就 可 以 直 接 從 子 類 中 派 生 程 序 邏 輯 主 體 放 在run( ) 方 法 中 將 線 程 控 制 隱 藏 起 來 這 個 子 類 如 下
  
  import Javaapplet*;
  import Javaawt*;
  class MultiThreadApplet extends Applet implements Runnable {
  Thread thisThread;
  Public void start( ) {   if(thisThread==null) {
   thisThread=new Thread(this);
   thisThreadstart( );{
   }
  public void stop( ) {
   if (thisThread! =null) {
  thisThreadstop( );
  thisThread=null;}
   }
  public void run ( ) {}}
     由 於run( ) 是 接 口Runnable 的 抽 象 方 法 所 以 在MultiThreadApplet 類 中 也 需 要 進 行 定 義 只 不 過 內 容 為 空 下 面 的 例 子 顯 示 如 何 使 用 這 個 類 程 序 包 含 一 個 無 限 循 環 累 加 操 作 並 將 結 果 顯 示 在 屏 幕 上
  
  import javaawt*;
  public class counter extends MultiThreadApplet{
  int Counter;
  public void run( ){
   while(true){
     counter++;
     repaint( );}
  }
   public void paint(Graphics g) {
  gdrawString(stringvalueof(counter));{
   }
     很 顯 然 這 個 小 程 序 對 線 程 的 操 作 已 被 隱 藏 在Multi ThreadApplet 中
  
    
  
   解 決 動 畫 中 的 一 些 問 題
     動 畫 的 本 質 就 是 運 動 的 圖 形 一 系 列 連 續 顯 示 的 靜 止 圖 形 會 給 我 們 一 種 連 續 動 畫 的 假 象 只 要 動 畫 速 度 足 夠 快 則 分 散 的 靜 止 圖 形 就 會 合 並 成 一 個 連 續 運 動 的 流 程
  
     繪 制 動 畫 十 分 簡 單 只 需 遵 照 以 下 三 步 即 可) 擦 去 整 個 小 程 序 繪 圖 區) 重 畫 動 畫 背 景) 在 新 的 位 置 繪 制 圖 形 但 是 當 動 畫 連 續 幀 之 間 運 動 和 顏 色 不 連 續 時 就 會 發 生 閃 爍 現 象( 例 子 略) 問 題 出 在 小 程 序 區 的 屏 幕 刷 新 上 有 兩 種 方 法 可 以 防 止 動 畫 閃 爍 第 一 種 方 法 是 只 做 局 部 刷 新 即 每 次 只 擦 除 改 變 的 部 分 例 如 如 果 要 繪 制 一 幅 飛 行 的 星 空 動 畫 每 次 刷 新 操 作 先 擦 去 前 一 位 置 的 星 星 再 在 新 的 位 置 繪 制 一 個 但 是 如 果 動 畫 比 較 復 雜 運 動 部 分 重 疊 較 多 則 局 部 刷 新 操 作 很 繁 瑣 也 影 響 程 序 運 行 速 度 在 這 種 情 況 下 可 以 用 另 外 一 種 方 法( 雙 緩 存) 來 解 決 閃 爍 問 題 它 的 核 心 思 想 是 在 屏 幕 外 完 成 一 幀 的 全 部 動 畫 然 後 把 最 後 繪 制 完 的 幀 顯 示 在 小 程 序 屏 幕 上 過 程 如 圖 所 示
  
  示 例 程 序 如 下
  
  import javaawt*;
  public class Ball extends MultiThreadApplet {
  Image ball=null;
  Image applet=null;
  Graphics appletGballG;
  Public void run( ){
   If(ball= =null){
     Applet=createlmage(bounds( )widthbounds( )
                Height);
     Ball=create Image();
     AppletG=appletgetGraphics( );
     BallG=ballgetGraphics( );
     BallGsetColor(Colorgray);
     BallGdrawOral(); {
   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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.