国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Applet編程技巧

2019-11-17 06:24:37
字體:
供稿:網(wǎng)友

  1.java Applet概述 

  Java程序分為兩類:Java小程序(Applet)和Java應(yīng)用程序(Applic ation),這兩類程序是有區(qū)別的。Java Applet嵌入在WWW的頁面,作為 頁面的組成部分被下載,并能運(yùn)行在實(shí)現(xiàn)Java虛機(jī)器(JVM)的Web瀏覽 器中。Java的安全機(jī)制可以防止小程序存取本地文件或其他安全方面 的問題。而一個(gè)Java應(yīng)用程序運(yùn)行于Web瀏覽器之外,沒有Applet運(yùn)行 時(shí)的諸多限制。另外,兩者程序設(shè)計(jì)上的最大區(qū)別在于:Java Applet 沒有主程序,而Java應(yīng)用程序一定要有主程序。
  在Java中每個(gè)applet都是由Applet的子類來實(shí)現(xiàn)。開發(fā)人員自定 義的applet通過重載A pplet的幾個(gè)主要成員函數(shù)完成小應(yīng)用程序的 初始化、繪制和運(yùn)行。這些函數(shù)是init()、pa int()、start()、sto p()和destory()。
  一個(gè)applet的生命周期與Web頁面有關(guān)。當(dāng)首次加載含applet的 頁面時(shí),瀏覽器調(diào)用ini t()方法,完成applet的初始化。然后調(diào)用pai nt()或start()方法繪制或啟動(dòng)程序。當(dāng)用戶離開頁面時(shí),瀏覽器調(diào)用 stop()方法停止小程序運(yùn)行。若用戶關(guān)閉瀏覽器將使applet停止運(yùn)行 ,瀏覽器調(diào)用destory()方法終止,使小應(yīng)用程序有機(jī)會(huì)釋放其存在期 間鎖定的資源。只要用戶不關(guān)閉瀏覽器,重新加載頁面,瀏覽器則只調(diào) 用start()方法和paint()方法重新繪制并運(yùn)行小程序。


  2.擴(kuò)展小程序基類支持多線程 

  通常情況下,設(shè)計(jì)小程序是為了給主頁增加交互性,使頁面更加生 動(dòng)活潑。因此,那些真正有用小程序,如動(dòng)畫、實(shí)時(shí)更新Internet服務(wù) 器信息回取、一般娛樂等通常都是持續(xù)運(yùn)行的,即小程序的邏輯主體 存在著無限循環(huán)。這個(gè)邏輯主體不宜放在幾個(gè)瀏覽器調(diào)用方法中,如i nit()、paint()、start()等。這是因?yàn)殡[含情況下,小程序所有主邏 輯都采用單一線程。當(dāng)瀏覽器調(diào)用方法中出現(xiàn)死循環(huán),則程序控制不 返回。假如用戶換到另一個(gè)頁面之后小程序還在運(yùn)行,就會(huì)浪費(fèi)處理 器資源。你可以做一個(gè)實(shí)驗(yàn),使用小程序查閱器運(yùn)行小程序,你會(huì)發(fā)現(xiàn) 查閱器本身完全停止作用,因?yàn)樗鹊秸{(diào)用函數(shù)返回后,才能繼續(xù)處 理其他事情(如響應(yīng)菜單)。顯然,這個(gè)邏輯主體必須放在其他地方。 解決方法是在小程序框架中加入線程,把邏輯主體放在線程run()方法 中。只在瀏覽器調(diào)用方法start()中生成線程,而在stop()中終止線程 運(yùn)行,這樣當(dāng)用戶不查閱時(shí)不會(huì)占用處理器資源。圖2表示瀏覽器、小 程序和線程之間的關(guān)系。
  由于瀏覽器/小程序/線程是所有瀏覽器都采用的模型,而Java.ap plet.Applet類本身并不支持線程。在實(shí)際使用中,為方便操作,我們 可以派生Applet類生成一個(gè)支持線程的子類, 今后再編寫applet時(shí), 就可以直接從子類中派生,程序邏輯主體放在run()方法中,將線程控 制隱藏起來。這個(gè)子類如下:
  import Java.applet.*;
  import Java.awt.*;
  class MultiThreadApplet extends Applet implements Runnab le {
   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的抽象方法,所以在MultiThreadApple t類中也需要進(jìn)行定義,只不過內(nèi)容為空。下面的例子顯示如何使用這 個(gè)類。程序包含一個(gè)無限循環(huán)累加操作,并將結(jié)果顯示在屏幕上:
  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), 10, 10); }
  }
  很顯然,這個(gè)小程序?qū)€程的操作已被隱藏在MultiThreadApplet 中。


  3.解決動(dòng)畫中的一些問題 

  動(dòng)畫的本質(zhì)就是運(yùn)動(dòng)的圖形,一系列連續(xù)顯示的靜止圖形會(huì)給我 們一種連續(xù)動(dòng)畫的假象。只要?jiǎng)赢嬎俣茸銐蚩?則分散的靜止圖形就 會(huì)合并成一個(gè)連續(xù)運(yùn)動(dòng)的流程。
  繪制動(dòng)畫十分簡(jiǎn)單,只需遵照以下三步即可:①擦去整個(gè)小程序繪 圖區(qū);②重畫動(dòng)畫背景;③在新的位置繪制圖形。但是,當(dāng)動(dòng)畫連續(xù)幀 之間運(yùn)動(dòng)和顏色不連續(xù)時(shí)就會(huì)發(fā)生閃爍現(xiàn)象( 例子略)。問題出在小 程序區(qū)的屏幕刷新上,有兩種方法可以防止動(dòng)畫閃爍。第一種方法是 只做局部刷新,即每次只擦除改變的部分。例如:假如要繪制一幅"飛 行的星空"動(dòng)畫,每次刷新操作,先擦去前一位置的星星,再在新的位置 繪制一個(gè)。但是,假如動(dòng)畫比較復(fù)雜,運(yùn)動(dòng)部分重疊較多,則局部刷新 操作很繁瑣也影響程序運(yùn)行速度。在這種情況下,可以用另外一種方 法( 雙緩存)來解決閃爍問題。它的核心思想是在屏幕外完成一幀的 全部動(dòng)畫,然后把最后繪制完的幀顯示在小程序屏幕上。過程如圖3所 示。
  示例程序如下:
  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(70,70);
   appletG=applet.getGraphics();
   ballG=ball.getGraphics();
   ballG.setColor(Color.gray);
   ballG.drawOral(0,0,70,70); }
   for(int x=0;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.80y,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()取得與小程序大小完全相同的屏外 圖形緩存,賦給變量app let,然后得到緩存的繪圖對(duì)象appletG。以后 對(duì)幀的刷新操作過程都是針對(duì)appletG。這包括清除幀、繪制背景、 在新位置繪制圖形。最后再用drawImage()方法把緩存復(fù)制到小程序 的屏幕顯示區(qū)。運(yùn)行這個(gè)小程序,你會(huì)發(fā)現(xiàn)動(dòng)畫非常平滑,不存在閃爍 現(xiàn)象。
  除了閃爍之外,假如動(dòng)畫過于復(fù)雜,幀速率就可能降低。若動(dòng)畫降 到每秒20幀,則動(dòng)畫會(huì)出現(xiàn)間斷現(xiàn)象影響顯示效果。因此有必要優(yōu)化 動(dòng)畫速度,下面列出了一些可行的方案;①畫得盡可能少;②用較快的 繪圖算法;③用顏色循環(huán)等技巧來繪畫某一部分;④用圖案來表示細(xì)節(jié) ;⑤用定點(diǎn)整數(shù)進(jìn)行三維計(jì)算;⑥用查詢的預(yù)先計(jì)算結(jié)果來處理復(fù)雜算 法。


  4.縮短小程序裝入時(shí)間 

  真正功能性的小程序本身并不小,這就意味著小程序從Internet 上下載需要花很多時(shí)間。隨著小程序的普及,越來越多的Internet頻 帶被用于從各地的服務(wù)器向客戶端Web瀏覽器傳送這些小程序,因此響 應(yīng)時(shí)間進(jìn)一步下降。為了縮短小程序下載和裝入時(shí)間,可以采取以下3 種方法。
  ?使執(zhí)行文件盡量小盡管Internet (TCP協(xié)議)可以接受任意長(zhǎng)度 的數(shù)據(jù)流,但負(fù)責(zé)點(diǎn)對(duì)點(diǎn)傳送的網(wǎng)絡(luò)設(shè)備(例如:路由器)對(duì)一次傳送分 組包的上限有嚴(yán)格的限制,通常這一限制是2 56的整數(shù)倍。因此,當(dāng)小 程序在網(wǎng)上傳送時(shí),按照上限它被分成若干包,而最后一個(gè)包可能只有 幾個(gè)字節(jié)。這些包是單獨(dú)傳送,需要在客戶端重新組裝為原先小程序 執(zhí)行文件字節(jié)流。當(dāng)最后一個(gè)包延遲時(shí),可能要用好幾秒來等待最后 幾個(gè)字節(jié)到達(dá)。唯一的解決辦法就是保持類文件盡量小。開發(fā)人員可 以在不影響程序邏輯主體的前提下嘗試下列方案:①刪除查錯(cuò)代碼;② 縮小String直接量;③選擇Java編譯器優(yōu)化編譯選項(xiàng);④刪除用不到的 方法等。
  ?類散保持在可控范圍內(nèi)幾乎沒有一個(gè)小程序是由一個(gè)類組成。 通常,開發(fā)人員為了實(shí)現(xiàn)一個(gè)功能較強(qiáng)的小程序需要從標(biāo)準(zhǔn)的Java基 類中派生出若干子類,并對(duì)之進(jìn)行組合。因此,若要使一個(gè)小程序運(yùn)行 ,Java虛擬機(jī)就要分別下載并裝入這些類。假如實(shí)現(xiàn)中類的數(shù)目較多, 下載的時(shí)間也就相應(yīng)較長(zhǎng)。我們都知道,下載20個(gè)獨(dú)立的數(shù)據(jù)塊比下 載一個(gè)相當(dāng)于20個(gè)數(shù)據(jù)塊之和的大數(shù)據(jù)塊要花費(fèi)更多的時(shí)間,這是由 于下載每個(gè)獨(dú)立數(shù)據(jù)塊都要重新進(jìn)行網(wǎng)絡(luò)聯(lián)接,而進(jìn)行每次聯(lián)接都要 花費(fèi)時(shí)間的緣故。因此,開發(fā)人員在設(shè)計(jì)小程序時(shí),類的數(shù)目要選擇適 中,即可保證結(jié)構(gòu)層次清楚,又要保證程序精簡(jiǎn),不增加冗余。
  ?縮短小程序初始化時(shí)間用戶討厭等待,因此,程序下載后應(yīng)盡量 縮短初始化時(shí)間。假如預(yù)處理工作較多,可以用輔助線程先同用戶進(jìn) 行交互,例如:問候用戶、詢問用戶姓名、顯示進(jìn)程指示等。總之,讓 用戶"忙起來"。同時(shí),小程序主線程可以繼續(xù)在后臺(tái)做初始化工作。 有句話請(qǐng)記住:"興奮時(shí)時(shí)間過得快",充分利用這一現(xiàn)象可以改變用戶 對(duì)小程序裝入時(shí)間的感覺。
  使用Java開發(fā)WWW客戶端應(yīng)用程序十分方便,技術(shù)也很多,本文只 簡(jiǎn)單介紹幾種方法和注重事項(xiàng)供大家參考。 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 疏勒县| 新源县| 黑山县| 东至县| 黄龙县| 自贡市| 定安县| 赞皇县| 贵阳市| 郎溪县| 齐齐哈尔市| 当涂县| 体育| 招远市| 行唐县| 伊宁县| 景德镇市| 昌乐县| 桓仁| 大埔县| 山东省| 宁乡县| 体育| 定南县| 定结县| 扬州市| 沐川县| 黄大仙区| 南乐县| 营山县| 疏勒县| 宜兰县| 岑巩县| 广州市| 呼图壁县| 拉萨市| 辽中县| 马关县| 广河县| 桦川县| 宜宾市|