2011-04-14 61 views
3

我有一個使用deployJava腳本部署的WebStart小程序。 JNLP文件看起來是這樣的:使用applet描述符和javascript在jnlp中輪詢applet下載進度

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<jnlp codebase="" href="launch.jnlp" spec="1.0+"> 
    <information> 
     <title>someApp</title> 
     <vendor>someCompany</vendor> 
     <homepage href="http://www.someCompanysWebsite.net"/> 
     <description>someDescription</description> 
     <description kind="short">someShortDescription</description> 
    <offline-allowed/> 
    </information> 
<update check="background"/> 
<security> 
<all-permissions/> 
</security> 
    <resources> 
<j2se version="1.5+"/> 
<jar href="mainJar.jar" main="true"/> 


<jar href="lib1.jar"/> 
<jar href="lib2.jar"/> 
<jar href="lib3.jar"/> 
<jar href="platform.jar"/> 
<jar href="plugin.jar"/> 
<jar href="slf4j-api-1.6.1.jar"/> 
<jar href="slf4j-simple-1.6.1.jar"/> 
</resources> 
    <applet-desc height="1" main-class="com.companyName.applet.appletClass" name="appletName" width="1"> 

    </applet-desc> 
</jnlp> 

正如你所看到的,我的小程序是1x1的大小,所以我不希望顯示與任何東西。它只是將一些java方法暴露給javascript。所以,如果我做一個JavaScript調用,例如

//javascript code 
var applet = document.getElementById('appletName'); 

我得到一個有效的句柄小程序,我可以調用它的方法在JavaScript這樣的:

//javascript code 
    applet.doStuff(); 

當然,每小程序定義了isActive()方法,所以在我的javascript代碼,我可以檢查這樣如果applet滿載:

//javascript code 
    function isFullyLoaded() 
    { 
     if (!applet.isActive()){ 
     setTimeout('isFullyLoaded()',1000); 
     } 
     else 
     { 
     //do nice stuff requiring the applet is loaded 
     } 
    } 

然而,隨着小程序的加載可能需要一段時間,我想HAV e加載的進度指示。快速瀏覽一下Sun(或Oracle,如果你是這麼傾向的),可以看到: http://download.oracle.com/javase/tutorial/deployment/applet/customProgressIndicatorForApplet.html

但是,這意味着我想在加載小程序時顯示加載欄或任何其他內容。我不喜歡小程序的外觀,這就是爲什麼我只是想查詢的小程序加載與JavaScript一樣,在一些間隔:

//javascript code 
alert(applet.getLoadingProgress()); 

我應該怎麼做,我應該改變JNLP聲明或類似的東西。任何指針或意見將不勝感激。請注意,我不想要自定義進度欄,而僅僅是一個結構,以便在加載期間可以使用JavaScript輪詢進度。

乾杯。

編輯: @amol 我會提請你注意的是JNLP部署applet和應用程序,它們的加載過程中,調用通用DownloadServiceListener類的方法的進步(URL的java.net.URL,java.lang.String中的版本,長readSoFar,long total,int overallPercent),只要下載一個所需的罐子。瞭解罐子的總數和尚未下載的罐子的數量將成爲完美的進步指標。我還希望引起您的注意,如果您調試了JNLP部署,您將看到這些方法被調用並記錄爲網絡級事件。所以,我的問題是如何使用JavaScript獲得這些方法的一個掛起,所以我可以有一些關於進度的估計,因爲我不想讓用戶看着java控制檯來估計進度。我不想也顯示一個不確定的進度加載器,因爲實現這個很容易,但是沒有實際用處。

回答

1

我不喜歡小程序的外觀..它使用'image' attribute

變化。

+0

這個問題當然是關於如何使用javascript輪詢applet web-start部署的applet的進度,而不是如何製作自定義加載屏幕或使用自定義加載屏幕替換默認圖形。 – 2011-04-15 07:08:44

+0

有很多方法可以實現最終目標,這看起來至少是一個有效的選項。如果該選項對於OP不起作用,OP不應該接受這是正確的答案,但我不確定爲什麼它被低估。 +1 @安德魯湯普森。 – 2011-04-15 15:34:14

+0

當然,它是低估的,因爲它根本不是問題的根源。問題是:'如何使用javascript獲取JNLP部署的applet的進度',而不是'如何更改applet外觀'或'如何使用自定義加載器'。因此,答案是無關緊要的,因爲它是一個完全不同的問題的答案。 – 2011-04-16 21:28:39

3

我不知道如何調查這樣,但我已經在過去使用的方式來實現你所描述的是如下 -

  • 當加載小程序(在我的情況 我通常在 DOM上點擊某個按鈕或 東西),顯示你的 javascript/html特定加載 指標。
  • 當小程序加載時,它會回調一個 javascript方法。 JS現在知道該applet已經完全加載,取下加載指示器,並執行任何進一步的JS-> applet通信等。

(顯示一個確定的進度條是不可能的,但使用這種方法。指示器掩蓋整個html主體或不確定的進度條是非常可能的,並且很容易實現)

3

在您發佈的Oracle站點的文檔(http://download.oracle.com/javase/tutorial/deployment/applet/customProgressIndicatorForApplet.html)中,小程序調用以下函數以指示其進度,然後相應地更新Applet UI和進度條。

public void progress(URL url, String version, long readSoFar, 
       long total, int overallPercent) {   
    // check progress of download and update display 
    updateProgressUI(overallPercent); 

} 

我相信,你可以簡單地說,替代調用updateProgressUI(overallPercent),一些調用一個JavaScript函數,它更新網頁中的進度指示器。

測試這個,讓我們知道是否有可能。

+0

我會測試它,謝謝。我想避免不得不從Java調用我的JavaScript(我想這樣做),但也許JSObject將是更好的解決方案。 – 2011-05-18 20:26:14