#javascript #applet #loading #progress #jnlp
#javascript #апплет #Загрузка #прогресс #jnlp
Вопрос:
У меня есть апплет WebStart, который я развертываю с помощью скрипта deployJava. Файл jnlp выглядит следующим образом:
<?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>
Как вы можете видеть, мой апплет имеет размер 1×1, поэтому я не хочу ничего с его помощью отображать. Это просто служит для того, чтобы предоставить некоторые методы java для javascript. Итак, если я выполняю вызов javascript, например
//javascript code
var applet = document.getElementById('appletName');
Я получаю действительный дескриптор апплета и могу вызывать его методы в javascript следующим образом:
//javascript code
applet.doStuff();
Конечно, для каждого апплета определен метод isActive (), поэтому в моем коде javascript я могу таким образом проверить, полностью ли загружен апплет:
//javascript code
function isFullyLoaded()
{
if ( !applet.isActive() ){
setTimeout('isFullyLoaded()',1000);
}
else
{
//do nice stuff requiring the applet is loaded
}
}
Однако, поскольку загрузка апплета может занять некоторое время, я хотел бы иметь индикатор хода его загрузки. Быстрый взгляд на Sun (или Oracle, если вы так склонны) показывает это:
http://download.oracle.com/javase/tutorial/deployment/applet/customProgressIndicatorForApplet.html
Однако это означает, что я хочу показывать панель загрузки или что-либо еще при загрузке апплета. Мне не нравится внешний вид апплета, и именно поэтому я просто хочу опросить загрузку апплета с помощью javascript, например, через некоторый интервал:
//javascript code
alert(applet.getLoadingProgress());
Что я должен делать и должен ли я изменить объявление jnlp или что-нибудь в этом роде. Любые указания или комментарии были бы оценены. Обратите внимание, что мне не нужен пользовательский индикатор выполнения, а просто структура, чтобы я мог опрашивать ход выполнения с помощью javascript во время загрузки.
Приветствия.
Редактировать: @amol Я обращаю ваше внимание на то, что апплеты, развернутые в JNLP, и приложение во время их загрузки вызывают метод progress общего класса DownloadServiceListener (java.net .URL url, java.lang.Строковая версия, long readSoFar, long total, int overallPercent) всякий раз, когда загружается один из требуемых jar. Знание общего количества jar-файлов и количества jar-файлов, которые еще предстоит загрузить, послужит идеальным показателем прогресса. Я хочу также обратить ваше внимание на то, что при отладке развертывания JNLP вы увидите, что эти методы вызываются и регистрируются как события сетевого уровня. Итак, мой вопрос заключается в том, как освоить эти методы с помощью javascript, чтобы я мог получить некоторую оценку прогресса, поскольку я не хочу, чтобы пользователь смотрел на консоль Java для оценки прогресса. Я не хочу также показывать загрузчик с неопределенным ходом выполнения, поскольку реализовать это несложно, но никакой практической пользы вообще.
Ответ №1:
Я не уверен, как проводить опрос как таковой, но подход, который я использовал в прошлом для достижения того, что вы описываете, заключается в следующем —
- Когда вы загружаете апплет (в моем случае я обычно вставляю соответствующий html-код в DOM нажатием кнопки или чего-то еще), отобразите свой индикатор загрузки, специфичный для javascript / html.
- Когда апплет загружается, он вызывает метод javascript. JS теперь знает, что апплет полностью загружен, отключает индикатор загрузки и выполняет любую дальнейшую связь JS-> applet и т.д.
(При таком подходе невозможно отобразить определенный индикатор выполнения. Но общий индикатор загрузки, который маскирует весь текст html или неопределенный индикатор выполнения, очень возможен и прост в реализации)
Ответ №2:
В документации с сайта Oracle, которую вы опубликовали ( http://download.oracle.com/javase/tutorial/deployment/applet/customProgressIndicatorForApplet.html ), апплет вызывает приведенную ниже функцию, чтобы указать свой прогресс, который затем соответствующим образом обновляет пользовательский интерфейс апплета и индикатор выполнения.
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, которая обновляет индикатор прогресса на веб-странице.
Протестируйте это и дайте нам знать, если это возможно.
Комментарии:
1. Я бы протестировал это, спасибо. Я хотел избежать необходимости вызывать мой javascript из Java (я хотел сделать это наоборот), но, возможно, JSObject будет лучшим решением.
Ответ №3:
Мне не нравится внешний вид апплета..
Измените его, используя атрибут ‘image’.
Комментарии:
1. Вопрос, конечно же, в том, как опрашивать прогресс развертывания апплета при веб-запуске апплета с помощью javascript, а не как создать пользовательский экран загрузки или заменить графику по умолчанию пользовательской.
2. Существует много способов достижения конечной цели, и этот выглядит, по крайней мере, допустимым вариантом. Если опция не работает для OP, OP не должен принимать это как правильный ответ, но я не уверен, почему за него проголосовали. 1 @ Andrew Thompson.
3. Это, конечно, было отклонено, потому что это вообще не ответ на вопрос. Вопрос заключается в следующем: «КАК получить прогресс развертывания апплета JNLP с использованием javascript», а не «КАК изменить внешний вид апплета» или «Как использовать пользовательский загрузчик». Следовательно, ответ не имеет значения, поскольку это ответ на совершенно другой вопрос.
4. У меня были другие полуформированные идеи о том, как подойти к этому в случае, если циклического изображения неопределенного индикатора выполнения было недостаточно. Учитывая ваш комментарий, я не стал утруждать себя дальнейшими размышлениями. Удачи с этим!