考慮到你要完成的任務(wù),一個(gè)applet,甚至幾個(gè)獨(dú)立的applet,有時(shí)可能都不夠。還好,applet之間可以通訊,通過協(xié)作它們可以完成一些更復(fù)雜的任務(wù)。一組協(xié)作的applet所能產(chǎn)生的效能使單個(gè)applet所不能媲美的。
Applet之間的通訊可以通過傳統(tǒng)方法實(shí)現(xiàn):applet可以互相調(diào)用對(duì)方的成員方法或者通過socket或數(shù)據(jù)流通訊。事實(shí)上,applet間互相查找的途徑有很多,每一種方法都有自身的優(yōu)缺點(diǎn)。本文將討論四種通訊機(jī)制,并給出一個(gè)較為復(fù)雜的例子,在這個(gè)例子中我們將使用其中一種通訊機(jī)制。
Java api 本身就有用來支持applet程序間協(xié)作的特性:AppletContext 類的 getApplet 和 getApplets 方法。設(shè)有這兩個(gè)函數(shù),applet程序可以通過名稱查找并訪問對(duì)方。你可以這樣調(diào)用 getApplet:
Applet friend = getAppletContext().getApplet("Friend");
一旦調(diào)用結(jié)束,變量 friend 就成了名為"Friend"的applet的一個(gè)實(shí)例(instance) (如果這樣的一個(gè)"Friend"applet存在的話)。例如:如果 "Friend" 是 Sun的 Animator applet 的一個(gè)實(shí)例,friend 將包含對(duì)這個(gè)實(shí)例的一個(gè)參考(reference)。
Applet的名字是在HTML中指定的,而不是在Java代碼中。為了創(chuàng)建一個(gè)能被前面的實(shí)例代碼所發(fā)現(xiàn)的animator applet,你可以在HTML插入如下幾行:
<!-- applet parameters go here -->
getApplets 方法和 getApplet 差不多,只不過getApplets返回一個(gè)Enumeration,其中列舉了所有可以進(jìn)行訪問的applet。然后我們就可以根據(jù)applet的不同屬性來查詢一個(gè)applet,包括applet的名字。下面示范了如何用getApplets查找一個(gè)名為"Friend" 的applet:
Applet friend;
for( Enumeration e = getAppletContext().getApplets();e.hasMoreElements(); ){
try {
Applet t = (Applet) e.nextElement();
if ("Friend".equals(t.getParameter("name"))) {
friend = t;
break;
}
}
catch (ClassCastException e) {
}
}
顯然,上述方法的工作很多,你不會(huì)用這種途徑去查找一個(gè)applet。然而,如果你要查詢多個(gè)applet,或是你不知道你所要查找的applet的確切的名字,這將是一種行之有效的方法。舉個(gè)例子來說,用getApplets查找所有以"Helper"開頭命名的applet將會(huì)很容易,你的applet就可以和同一頁(yè)面中的所有的helper applet通訊了。
不幸的是,這種官方推薦的applet通訊機(jī)制至少有兩大問題。首先,這種機(jī)制目前并沒有被具體化,因此不同的應(yīng)用程序?qū)υ摍C(jī)制有不同的實(shí)現(xiàn)。例如,getApplets 返回的是可以訪問的applet,但是什么是可以訪問?沒有明確的定義。你可能得到的是同一頁(yè)面上的applet,從同一個(gè)站點(diǎn)加載的applet,或者是兩者的交集,這些都取決于運(yùn)行applet的瀏覽器。這些問題因該促使Sun和Java's licensees制定出一個(gè)更加嚴(yán)密的,明確定義的applet協(xié)作機(jī)制。不過目前為止,這種applet通訊及值的不一致實(shí)現(xiàn)仍然是個(gè)令人頭痛的問題。
另外一個(gè)問題就沒有這么簡(jiǎn)單了。它看起來很容易理解,但它會(huì)使事情復(fù)雜到令很多applet程序員吃驚的地步。問題出在 getApplet 和 getApplets 不會(huì)讓你得到一個(gè)還沒有完全加載并初始化了的applet。由于網(wǎng)絡(luò)的不確定和其他因素,例如applet的大小,我們不能決定頁(yè)面上哪一個(gè)applet首先被加載,哪一個(gè)最后被加載。這就意味著我們?cè)瓉淼挠?jì)劃:首先啟動(dòng)并控制一個(gè)applet,查找其他applet,然后同它們協(xié)作,如果不增加額外的處理的話,是不能夠達(dá)到預(yù)期目的的。
當(dāng)然了,解決上述問題有很多方法??刂芶pplet可以檢查它的協(xié)作伙伴,如果它們還沒有就緒,就進(jìn)入等待睡眠(一秒鐘左右),然后再次協(xié)作applet的狀態(tài),直到所有協(xié)作成員都已被初始化過。雖然這種方法效率很低,會(huì)導(dǎo)致較長(zhǎng)的啟動(dòng)時(shí)間,怎么說它還是有效的。一個(gè)更好的解決方法是“雙向查找、提醒機(jī)制”(two-way search-and-notification mechanism),當(dāng)一個(gè)applet初始化完成后,控制這個(gè)applet查找其他applet并通知它們“我準(zhǔn)備好了”。使用這種機(jī)制,所有輔助applet(helpers initialize)初始化完成后,主控applet將能夠立即找到它們并開始協(xié)作,如果哪個(gè)輔助appplet遲一步完成初始化,主控applet也會(huì)被及時(shí)通知。
很多情況下,我們可以通過使用一個(gè)通用類的靜態(tài)成員變量和方法構(gòu)造一個(gè)內(nèi)部applet通訊機(jī)制。如果多個(gè)applet都依賴于這個(gè)通用類,它們就可以把這個(gè)類作為一個(gè)消息的匯集點(diǎn)(rendezvous point),在那里注冊(cè)它們的存在并察看其他applet的存在。
這里有個(gè)例子。如果在一個(gè)頁(yè)面上ColorRelay applet被使用多次,不同的實(shí)例通過協(xié)作顯示不同的圖片(一些不同顏色的打字機(jī)色帶)。你可以想象這些applet依靠一個(gè)標(biāo)志位。如果一個(gè)applet顯示了彩色的圖片,其他的只能現(xiàn)實(shí)黑白的圖片。圖 1.1 是運(yùn)行時(shí)的截圖,清單 1.1 是 HTML 代碼。
圖 1.1 : ColorRelay applet 運(yùn)行中
創(chuàng)新互聯(lián)建站專注于昌邑企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站開發(fā)。昌邑網(wǎng)站建設(shè)公司,為昌邑等地區(qū)提供建站服務(wù)。全流程按需定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
清單 1.1. ColorRelay.html.
Used Applets Sale!
msnet.tjg.ColorRelay.class"
width=50 height=50 name="first">
Low, low prices!
width=50 height=50>
This week only!
width=50 height=50>
We won't be undersold!
清單 1.2 展示了 ColorRelay applet的程序框架,具體方法用注釋代替了。我們將在后面的清單中提供完整的代碼。
清單 1.2. ColorRelay.java (part 1).
/*
* ColorRelay.java 1.0 96/04/14 Glenn Vanderburg
*/
package COM.MCP.Samsnet.tjg;
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
/**
* An applet which coordinates with other instances of itself on a web
* page to alternately flash copies of an image in different colors.
*
* @version 1.0, 14 Mar 1996
* @author Glenn Vanderburg
*/
public class ColorRelay extends Applet implements Runnable
{
// These are used to maintain the list of active instances
static ColorRelay list, listTail;
ColorRelay next, prev;
// This thread switches between instances
static Thread relayer;
// This is the original, unmodified base image which all
// of the instances use.
static Image originalImage;
// The color that this instance uses to flash. White is the default.
Color flashColor = Color.white;
// The modified, colorized image.
Image modifiedImage;
// The image currently being displayed. This reference
// alternates between originalImage and modifiedImage.
Image image;
// We use a media tracker to help manage the images.
MediaTracker tracker;
// The time we wait while flashing. Two seconds is the default.
int sleepSecs = 2;
// Method: static synchronized
// addToList(ColorRelay elem) Listing 1.3
// Method: static synchronized
// removeFromList(ColorRelay elem) Listing 1.3
// Method: public init() Listing 1.4
// Method: public start() Listing 1.5
// Method: public stop() Listing 1.5
// Method: public run() Listing 1.5
// Method: public getAppletInfo() on CD
// Method: public getParameterInfo () on CD
// Method: public paint(Graphics g) on CD
// Method: public update(Graphics g) on CD
// Method: flash() on CD
// Method: parseRGB(String str) on CD
}
正如你看到的那樣,程序中有一些普通的變量:兩個(gè)Iamge,一個(gè)Color,一個(gè)MediaTracker,一個(gè)時(shí)間值,還有兩個(gè)靜態(tài)方法用來將 ColorRelay 對(duì)象插入鏈表。此外還有四個(gè)靜態(tài)變量:originalImage, 當(dāng)applet沒有輪到發(fā)亮?xí)r顯示;一個(gè)線程對(duì)象,用來協(xié)調(diào)applet之間的活動(dòng),還有applet鏈表的首位節(jié)點(diǎn)。
未完,待續(xù)。
翻譯:chenyuan_tongji (Mailto:chenyuan_tongji@sian.com">chenyuan_tongji@sian.com)
網(wǎng)站題目:Applet間的通訊(1)--TricksoftheJavaProgrammingGurus(轉(zhuǎn))
本文路徑:http://jinyejixie.com/article48/pgejhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站導(dǎo)航、電子商務(wù)、面包屑導(dǎo)航、品牌網(wǎng)站制作、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)