Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Refresh страницы, что за ***** происходит с апплетом? 
:(
    Опции темы
TrivialCore
Дата 29.10.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 26.4.2004

Репутация: 1
Всего: 5



Кто-нибудь может обьяснить мне поведение апплета после рефреша страницы, на которой он сидит? Или где прочитать об этом.
Просто после рефреша при загрузке начальных данных он входит в бесконечную петлю, и это кончается StackOverflowError. Судя по коду, в эту петлю он не имеет шанс попасть, т.к. есть булиновская переменная специально это контролирующая. Но тут будто ее нет, или ее значение по неизвестным причинам при каждом "входе" сбрасывается на false, чего быть по идее не может, т.к. эта переменная - поле класса, который тут выражен конкретным единичным обьектом.

Кто знает, помоги(те).
PM MAIL   Вверх
sergejzr
Дата 29.10.2004, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Код в студию :)
Без него сказать что либо трудно..


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
TrivialCore
Дата 29.10.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 26.4.2004

Репутация: 1
Всего: 5



Ладно, попробуем. Все разыгрывается в 3-х классах:



Код
public class SqlInstancesController {
  //...
   public void update(Object data[][]) {
       ArrayList instances = new ArrayList();
       for (int i=0; i<data.length; i++) {
           SqlInstancesBean bean = new SqlInstancesBean();
           bean.setBox((String)data[i][0]);
           bean.setInstance((String)data[i][1]);
           bean.setSchema((String)data[i][2]);
           bean.setHld((String)data[i][3]);
           bean.setChecked(((Boolean)data[i][4]).booleanValue());
           instances.add(bean);
       }
       sqlInstancesModel.setInstances(instances);
   }
}


Код
public class SqlInstancesModel extends Observable {
   
  //...
   public void setInstances(ArrayList instances) {
       this.instances = instances;
       setChanged();
       notifyObservers(instances);
   }
 //...
}

Код
public class SqlInstancesTabModel extends AbstractTableModel implements Observer,
       TableModelListener {

   private boolean circleStarted = false;

//...

   public void update(Observable o, Object arg) {
       if (circleStarted) {
           circleStarted = false;
       } else {
           if (arg instanceof Collection) {
               Collection instances = (Collection) arg;
               data = new Object[instances.size()][5];
               int rowCount = 0;
               Iterator i = instances.iterator();
               while (i.hasNext()) {
                   SqlInstancesBean instancesBean = (SqlInstancesBean) i.next();
                   data[rowCount][0] = instancesBean.getBox();
                   data[rowCount][1] = instancesBean.getInstance();
                   data[rowCount][2] = instancesBean.getSchema();
                   data[rowCount][3] = instancesBean.getHld();
                   data[rowCount][4] = new Boolean(instancesBean.isChecked());
                   rowCount++;
               }
               circleStarted = true;
               fireTableDataChanged();
           }
       }
   }

   public void tableChanged(TableModelEvent e) {
       sqlInstancesController.update(data);
   }

}


В приложении есть по одному экземпляру каждого из классов. SqlInstancesTabModel прикреплен к SqlInstancesModel в качестве Observer.
Все начинается с того, что нечто зовет sqlInstancesController.update(), который зовет sqlInstancesModel.setInstances(), который сигнализирует об изменениях своим Observer, что означает, что он просто зовет sqlInstancesTabModel.update(), который устанавливает circleStarted = true и зовет sqlInstancesController.update(), круг замыкается, но при следующем проходе из-за того, что circleStarted == true, круг прерывается.

А после рефреша страницы почему-то не прерывается!


PM MAIL   Вверх
DarkDS
Дата 29.10.2004, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: нет
Всего: 16



+ трейс стак оверфлоу дать можешь?
PM MAIL   Вверх
TrivialCore
Дата 29.10.2004, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 26.4.2004

Репутация: 1
Всего: 5



Код
java.lang.StackOverflowError

at java.awt.Toolkit.getEventQueue(Unknown Source)

at java.awt.EventQueue.isDispatchThread(Unknown Source)

at javax.swing.SwingUtilities.isEventDispatchThread(Unknown Source)

at javax.swing.JComponent.revalidate(Unknown Source)

at javax.swing.JTable.resizeAndRepaint(Unknown Source)

at javax.swing.JTable.tableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at com.hp.web.util.multitool.gui.TableSorter$TableModelHandler.tableChanged(TableSorter.java:341)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

PM MAIL   Вверх
sergejzr
Дата 29.10.2004, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Решение влоб сажать circleStarted на false уже в init()


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
DarkDS
Дата 29.10.2004, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: нет
Всего: 16



com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)
Это какой метод?
Добавлено @ 16:43
+ circleStarted = true; попробуй выствить сразу после else
Добавлено @ 16:46
Цитата(sergej @ 29.10.2004, 16:28)

Решение влоб сажать circleStarted на false уже в init()

:) Циклится не изза false. Там нужно во время в true выставить :)

PM MAIL   Вверх
TrivialCore
Дата 29.10.2004, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 26.4.2004

Репутация: 1
Всего: 5



Не пойму, что значит - вовремя? У меня ведь тоже вовремя, т.к. само по себе все работает на здравие. Проблема в том, чтобы определить - почему работает иначе при рефреше страницы!
Добавлено @ 16:53
Цитата(DarkDS @ 29.10.2004, 16:42)

com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)
Это какой метод?
Это метод tableChanged() =)

PM MAIL   Вверх
TrivialCore
Дата 29.10.2004, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 26.4.2004

Репутация: 1
Всего: 5



Нашел проблему, осталось ее только решить. Дело в том, что при рефреше старые обьекты не убиваются, а остаются жить! В данном случае это не касается sqlInstancesModel и sqlInstancesController (т.к. они - уникальные статичные экземпляры своего класса), зато касается sqlInstancesTabModel, который является обычным Observer, "смотрящий" на sqlInstancesModel.
Так вот, после рефреша на него смотрят уже два класса типа SqlInstancesTabModel! Каждый из них при апдейте запускает sqlInstancesController - вот из-за этого и рождается бесконечная петля, и одной переменной circleStarted тут уже недостаточно.

Поэтому вопрос: как при рефреше убить все живущие (хотя бы в апплете) обьекты?

Это сообщение отредактировал(а) TrivialCore - 29.10.2004, 17:53
PM MAIL   Вверх
sergejzr
Дата 29.10.2004, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(TrivialCore @ 29.10.2004, 16:53)

Дело в том, что при рефреше старые обьекты не убиваются, а остаются жить!


Очень хорошо! это весьма ценная информация!
Поищем насчёт деструкции обьектов..





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
TrivialCore
Дата 29.10.2004, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 26.4.2004

Репутация: 1
Всего: 5



Дело в том, что при таком рестарте апплета машина явы остается та же, без перезагрузки. Поэтому статичные экземпляры классов остаются такими, какими мы их оставили. Так как к некоторым из этих экземпляров прикреплены Observer, то и эти Observer остаются жить.

Можно отслеживать всех "смотрящих" и их убивать, но у меня их довольно много, поэтому хотелось бы какое-нибудь реальное weapon of mass destruction =)

Например убить машину и возродить заново.

Но как?
PM MAIL   Вверх
sergejzr
Дата 29.10.2004, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



попробуй в функциях:
stop + destroy + init + start
Выдавать сообщения, чтобы увидеть в каком порядке они вызывайытся при рефреше. Возможно не вызывается destroy()..



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
TrivialCore
Дата 29.10.2004, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 26.4.2004

Репутация: 1
Всего: 5



Во, именно это было нужно. В destroy() можно компактно поуничтожать все статичные обьекты. А вместе с ними умрут и все Observer, сборщик мусора их вытрет.
Спасибо =)
PM MAIL   Вверх
sergejzr
Дата 29.10.2004, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Ну слава богу :) А то какие-то странности были :)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Апплеты | Следующая тема »


 




[ Время генерации скрипта: 0.0603 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.