Здравствуйте, Аноним, Вы писали:
А>Как это вы "передвигаете"? Наверное, средствами 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