Re[4]: Проблема с повторной инициализацией аплета
От: mikalai.kardash Беларусь  
Дата: 30.07.07 07:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как это вы "передвигаете"? Наверное, средствами JS пишете iframe код в другом месте страницы и браузер загружает содержимое iframe (для него это новый iframe), т.е. стартует новый апплет.


Передвигаю я его следующим образом:
document.getElementById('div2').appendChild(
document.getElementById('myframe')
);

Т.е. у фрейма меняется parent елемент.

А>А старый наверное продолжает работать. Поскольку JVM одна, то два одинаковых апплета, работающих одновременно, мешают друг другу каким-то образом. Таким образом, надо сначала убедиться, что старый апплет остановлен и его состояние сохранено где-нибудь. Не хотите на сервере, тогда попробуйте в браузере, в JS сохранить. А вообще, смешивать JS и апплеты — это как пиво с портвейном. Совершенно неинтересно и неперспективно.


Перезагрузки фрейма не происходит. HTML каким был таким и остается. JVM (Sun, не MS), при перемещении аплета, останавливает старый инстанс аплета, вызывает ему destroy(), вызывает init, start для нового инстанса аплета. Что имеем: для браузера (IE) аплет не изменился, ссылки остались на старый инстанс; для JVM аплет поменялся.

Поэтому, даже если я копирую все данные из старого аплета, то мне они никак не пригождаются — новый аплет для меня не существует, я не могу к нему никак обратиться. При обращении к аплету, из JS вызываются методы старого инстанса аплета.

Я сделал тестовый аплет, который только и делает что на init() создает себе ID — рандомный long. JVM log:

//Создаем аплет с ID -1596415299
basic: Loading applet ...
basic: Initializing applet ...
basic: Starting applet ...
Applet: Init called. AppletID = -1596415299
Applet: start method is called. AppletID = -1596415299

Display Panel: PAINT method is called. AppletID = -1596415299


Display Panel: PAINT method is called. AppletID = -1596415299


//в аплете есть функция которую можно вызывать из JS
liveconnect: Invoking method: public void com.applet.MyApplet.scriptCalledFunction(java.lang.String)
liveconnect: Needs conversion: java.lang.String --> java.lang.String

//Все ОК, обращение идет к аплету с ID -1596415299
Display Panel: received message from client [Test message to applet] when AppletID = -1596415299

Display Panel: PAINT method is called. AppletID = -1596415299
Display Panel: PAINT. Message = Test message to applet

//Перемещаем iframe с аплетом в другой DIV
//останавливается аплет
basic: Stopping applet ...
basic: Removed progress listener: sun.plugin.util.GrayBoxPainter@c7e553
basic: Finding information ...
basic: Releasing classloader: sun.plugin.ClassLoaderInfo@16897b2, refcount=0
basic: Caching classloader: sun.plugin.ClassLoaderInfo@16897b2
Applet: stop method is called. AppletID = -1596415299

Display Panel: PAINT method is called. AppletID = -1596415299
Display Panel: PAINT. Message = Test message to applet

//вызывается destroy()
basic: Current classloader cache size: 1
basic: Done ...
basic: Joining applet thread ...
basic: Destroying applet ...
basic: Disposing applet ...
Applet: destroy method is called. AppletID = -1596415299
basic: Joined applet thread ...
basic: Unregistered modality listener
basic: Quiting applet ...

//создается новый аплет с ID -1756904681
basic: Registered modality listener
liveconnect: Invoking JS method: document
liveconnect: Invoking JS method: URL
basic: Referencing classloader: sun.plugin.ClassLoaderInfo@16897b2, refcount=1
basic: Added progress listener: sun.plugin.util.GrayBoxPainter@f4a24a
basic: Loading applet ...
basic: Initializing applet ...
basic: Starting applet ...
Applet: Init called. AppletID = -1756904681
Applet: start method is called. AppletID = -1756904681

Display Panel: PAINT method is called. AppletID = -1756904681


Display Panel: PAINT method is called. AppletID = -1756904681


//пытаемся вызвать из JS функцию аплета
//она вызывается для аплета с ID -1596415299 ... хотя он уже должен бы быть остановлен...
liveconnect: Invoking method: public void com.applet.MyApplet.scriptCalledFunction(java.lang.String)
liveconnect: Needs conversion: java.lang.String --> java.lang.String
Display Panel: received message from client [Test message to applet] when AppletID = -1596415299
liveconnect: Invoking method: public void com.applet.MyApplet.scriptCalledFunction(java.lang.String)
liveconnect: Needs conversion: java.lang.String --> java.lang.String
Display Panel: received message from client [Test message to applet] when AppletID = -1596415299


//прорисовывается только новый аплет
Display Panel: PAINT method is called. AppletID = -1756904681


Display Panel: PAINT method is called. AppletID = -1756904681
ICQ: 241785166
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.