Java咖啡館(10):情人節的Applet

文章來源:電腦愛好者 作者:Gary Chan

  朋友們大家好,Java咖啡館又開張了!這次爲喜歡Java的朋友們奉上Applet系列教程,讓我們一起步入圖形界面Java應用程序的世界!

  本期咖啡館的實例程序是送給各位同道好友用來討女孩子歡心的,效果如圖所示。圖片上有“老鼠愛大米”字樣的星辰出現在蔚藍色的天空中,再加上一些文字輔助,像模像樣的新聞呢,一定給她驚喜!

  事先聲明,這些信息純屬虛構,僅供娛樂,祝各位情人節快樂而已,不過,用心做出來的禮物絕對比上街買的鮮花禮物更彌足珍貴吧!


Applet一分鐘入門

  與咖啡館以前介紹的Java應用程序不同,Java Applet是一種鑲嵌在HTML網頁中,然後由支持Java的瀏覽器(比如Netscape Navigator、IE以及現在流行的Firefox)下載並啓動運行的Java程序。雖然Applet運行在瀏覽器中,由於Java本身的強大功能,它可以完成許多HTML本身無法做到的效果,比如網絡通訊以及複雜的網頁特效。

  說到這裏,大家很自然會把Applet跟Macromedia公司的Flash技術進行比較。沒錯,它們有很多相似之處,比如都是通過插件運行在瀏覽器中,能帶給瀏覽器更豐富的交互功能(比如在線遊戲),甚至可以擴展到了高端手機中。相對而言,Flash的強項在於矢量動畫,而且非常輕便,一個插件1MB都不到;而Applet是一個全功能技術,與J2EE技術結合起來將給你更大的想象空間,這是Flash技術不能比擬的。

編寫一個Applet只需要四個步驟:

  1.Import相應的類和包

  2.從Applet類繼承一個子類

  3.實現某些Applet的方法

  4.嵌入網頁運行

  如果你有些無法理解上面的術語,趕快翻開去年的Java咖啡館連載溫故而知新吧!

設計Applet

  或許有的朋友接觸過類似遊戲,但那些網頁基本都是通過動態網頁技術,比如PHP、ASP、JSP等在服務器端繪製圖片然後顯示出來的。殺雞焉用牛刀,通過最簡單的Applet,然後再玩一些小技巧同樣能達到完美效果,並且不需要特殊的服務器來執行動態網頁,普通的靜態個人主頁空間裏也能夠實現這個效果。

  首先讓我們完成這個Applet程序設計,也就是完成Applet編寫步驟的前三步。說穿了,這個Applet的工作只是讀取背景圖片然後繪製“老鼠愛大米”字樣。關鍵問題在於,“老鼠”和“大米”應該可以通過參數控制,比如替換成“帥哥”、“美女”等,這樣就可以當做一種服務提供給朋友,讓他們通過設定網頁參數達到不同的星辰效果,而不是讓他們手動修改源代碼。實際上,Applet可以通過getParameter()方法從HTML中獲取參數。

  還是讓我們通過源代碼來了解Applet吧。打開Eclipse,新建一個NewsApplet類,輸入如下代碼:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;

public class NewsApplet extends Applet {
Image snapshot;

String from, to; public void init() {
from = null == getParameter("from") ? "老鼠" : getParameter("from");
to = null == getParameter("to") ? "大米" : getParameter("to");

snapshot = getImage(getCodeBase(), "snapshot.jpg");
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(snapshot, 0);

try {
tracker.waitForID(0);
} catch (Exception e) {
System.out.println("無法下載snapshot.jpg!");
}
}

public void paint(Graphics g) {
g.drawImage(snapshot, 0, 0, snapshot.getWidth(this), snapshot.getHeight(this), this);

g.setFont(new Font("華文彩雲", Font.BOLD + Font.ITALIC, 14));
g.setColor(Color.white);

g.drawString(from, 30, 90);
g.drawString("愛", 50, 105);
g.drawString(to, 70, 120);
}
}
下面解釋一下代碼:

  首先,所有Applet程序都是從Applet類繼承而來的,所以用extends Applet表示這種繼承關係,這樣NewsApplet類便擁有了Applet類的所有能力。

  接着是三個成員變量,snapshot用來讀取snapshot.jpg圖片,也就是圖中顯示的海洋和椰子樹的圖片,這個圖片應該放在Eclipse項目的根目錄中,即與最終的class文件處於同一個目錄中;from和to用來記錄你和她的名字。

  然後是兩個方法,init()和paint()。每個applet可以實現許多方法,有的表明生命週期,有的負責繪圖和事件的觸發。比如NewsApplet類中的init()方法將會在Applet每次裝載的時候被調用,而paint()方法將會在每次重繪時候被調用。

  init()函數非常適合進行資源初始化,比如程序中首先通過getParameter()函數獲取網頁中提供的參數,然後用getImage()讀取圖像資源並且用MediaTracker的waitForID()方法確保圖片完成下載。

  paint()非常重要,它完成了所有的繪圖過程。在代碼中,首先通過drawImage()方法繪製圖像,然後再適當的位置把星辰的文字畫上去即可。

 OK,保存一下項目,然後可以點擊Eclipse的Run菜單的Run as-Java Applet項來預覽這個Applet了,是不是很簡單?

結合網頁
  把Applet嵌入網頁很簡單,只要一個<applet>標籤即可。拿我們的NewsApplet類舉例,在Eclipse項目的根目錄中新建一個sample.htm,源代碼如下:

<html>

<body>

<applet code="NewsApplet.class" codebase="." width=480
height=384>

<param name="from" value="Prince Charming">

<param name="to" value="Cinderella">

</applet>

</body>

</html>
  其中<applet>標籤表示這裏定義一個Applet,它對應的文件名是NewsApplet.class,它的相對路徑是當前目錄。<applet>標籤中有兩個<param>標籤,這就是上文提到過的傳遞給Applet的參數。

Just Do It

  如果現在用瀏覽器打開這個sample.htm將會得到什麼結果?驗證你的猜測。

  除了用瀏覽器觀察Applet,J2SE SDK提供的小工具appletviewer也非常好用。打開Windows的“命令提示符”,進入sample.htm所在的目錄,然後輸入:appletviewer sample.htm,來親自體驗一下appletviewer吧。

與JavaScript交互

  JavaScript應該是大家非常熟悉的客戶端腳本語言。雖然名字中帶有Java,但它和Java語言只是在語法上有類似之處,JavaScript是由瀏覽器解釋運行,與Applet由Java虛擬機執行完全不一樣。不過,這兩個沒有血緣關係的同班同學倒是可以精誠合作,Applet實現底層的工作,JavaScript執行更高層的調用,從而實現意想不到的效果。

  JavaScript可以通過多種途徑操縱Applet。首先,JavaScript能調用Applet中的public的方法,這時的Applet好像一個聽話的機器人一樣好用。另外一種方法就是用JavaScript直接修改HTML結構,這樣可以定製Applet的各種屬性,有更大的靈活性。

  剛纔說了,我們的目標是把這個Applet製作成一種服務,即使不懂編程的朋友通過設置網頁的參數就能夠使用,因爲不是每個人都有能力(或者精力)修改源代碼的。所以,需要把Applet的參數做成可定製的,而這個只能夠由JavaScript完成。雖然我們可以給Applet寫一些類似於setFrom()和setTo()的方法給JavaScript調用,但是問題在於JavaScript函數的執行時機,因爲Applet無法通知JavaScript它已經完成初始化操作了。

  所以,我們應該走第二條路,即用JavaScript直接修改HTML結構,動態把<applet>標籤寫入HTML。從而,我們最終版本的index.htm代碼如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>大千世界無奇不有</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

<body>

<script language="JavaScript">

// 得到URL中的參數

var urlquery = location.href.split("?");
if (urlquery.length > 1) {

// 解析參數並獲取from和to

var urlterms = urlquery[1].split("&");

var from = decodeURIComponent(urlterms[0].substring(5));

var to = decodeURIComponent(urlterms[1].substring(3));
// 動態把<applet>標籤寫入HTML

document.write('<center>');

document.write('<h1>愛琴海上千年罕見的奇觀</h1>');

document.write('</center>');

document.write('<hr>');

document.write('<p align=center>http://www.cfan.com.cn 2005年2月14日 記者:GaryChan</p>');

document.write('<applet code="NewsApplet.class" codebase="."
width=480 height=384>');

document.write(' <param name="from" value="' + from + '">');

document.write(' <param name="to" value="' + to + '">');

document.write('</applet>');

document.write('<p>酷似漢字的星辰若隱若現&?lt;/p>');

document.write('<img src="crowd.jpg">');

document.write('<p>世界各地人們蜂擁而來爭相觀賞</p>');

document.write('<p>科學家表示,白天能夠達到肉眼辨別的星辰非常罕見。<p>');

document.write('<p>據稱,如果名字跟星辰相似,一定能夠得到神靈的祝福。<p>');

}

</script>
 <form>

<p>你的名字:

<input name="from" type="text" id="from" width="100">

她的名字:<input name="to" type="text" id="to" width="100">

<input type="submit" name="Submit" value="提交">

</p>

</form>

</body>

</html>

  由於JavaScript的語法與Java還是非常接近的,所以請參考注視自行閱讀代碼。需要注意的是,由於Java默認的字符集是Unicode,所以把網頁的內碼設成UTF-8可以省卻非常多的麻煩。

  根據這個Applet與JavaScript結合編程思路,你能夠做出許多的創意,記得跟大家分享哦。

我只想用這個Applet

  這個Applet已經上傳至http://www.cfan.com.cn/11program/200503/index.htm,歡迎大家實行拿來主義。你可以填入你的名字(比如:至尊寶)以及她的名字(比如:白晶晶),提交以後便可以看到最終結果。然後把地址欄中長長的一串URL全部複製給你的她,當她用瀏覽器打開的時候便可以看到你精心爲她準備的情人節禮物了。

如果你無法得到正確的結果,有這麼幾種可能:

  1.需要升級Java虛擬機。Windows內置的Microsoft Virtual Machine是基於1997年Java1.1版本的,距今已經有相當長的時間了。另一方面,2007年12月以後微軟公司便沒有義務在Windows中內置對Java的支持了。現在的J2SE已經推出了5.0版本,是一個成熟而且被廣泛採用的技術。所以,你應該毫不猶豫地把你的系統中的VM升級到Sun公司的最新版本。注意,微軟公司雖然極力推薦人們把Java程序向他們公司的C#和J#移植,但是它們都不是跨平臺的。更有甚者,由於微軟的不正當競爭,單方面提早從Windows系統中去掉了對Java的支持。縱然罰了許多款,也無法挽回Windows XP默認不安裝Java運行時環境的局面。所以,要看到Applet的執行結果,首先請到http://java.sun.com/j2se/1.5.0/download.jsp下載並安裝Java運行時環境。

  2.瀏覽器必須支持JavaScript的運行。

  3.MyIE等第三方瀏覽器有可能屏蔽Applet,請用IE瀏覽該網頁。

  歡迎到garychan.3322.org提出建議或者意見,讓我們共同享受Java技術帶來的體驗。

  如果你覺得這期咖啡館還不解渴,下面是一些由Gary推薦的閱讀材料:

Sun公司官方的Java教程

http://java.sun.com/docs/books/tutorial/index.html

  這個教程是由Sun維護並且不斷更新的,其中Getting Started和Writing Applets兩章可以讓您掌握更多的Applet知識。

洪恩在線的Java Applet實例講解

http://www.hongen.com/pc/homepage/applet/

  提供一個簡單的Java Applet入門,以及非常豐富的例程。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章