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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как слушать другой обьект... 
V
    Опции темы
sith
Дата 5.4.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



... такая задача...
... есть обьекты Х и  Y... которые создаються в обьекте Z... как реализовать следующую задачу... обьект X  должен слушать обьект  Y и делать какието действия...  smile 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
Maksym
Дата 5.4.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



sith
Гм, так мы же с тобой в соседней теме обсудили события и их слушателей, LSD там довольно подробно все расписал.. 
Конкретизируй задачу и что именно непонятно.
PM MAIL   Вверх
sith
Дата 5.4.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



как бы это обьяснить... 
... как делать обработчик я понял... а как другим обьектам пользоваться им не понимаю...
вот допустим мой конкретный случай... 
есть обьект InputThread in - он принимает входящие сообщения... этот обьект создаеться в обьекте ClienyThread... что бы слушать этот обьект я делаю следующее действие...

... 
Код

InputThread in = new InputThread(s);
           in.start();
           in.addChangeListener(new Listener()
           {
               public void valueChange(Event ev){
              System.out.print("new message");
               }
           });


... то есть я создаю обьект и добавляю слушателя... а как допустим слушать изменения в обьекте in другим обьектам, которые не имеют никакого отношения к его созданию...?


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
LSD
Дата 5.4.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Объект который хочет слушать события от InputThread должен знать от какого InputThread он хочет слушать события, и значит иметь ссылку на него. А раз есть ссылка, то можно вызывать in.addChangeListener(this);.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Maksym
Дата 5.4.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Смотри, объект, который хочет чтоб его слушали должен иметь метод типа add...Listener(...), например addChangeListener(ChangeListener listener), который требует от своего параметра (заинтересованного в событии объекта) реализации интерфеса определенного слушателя, к примеру ChangeListener.
Такой интерфейс обычно содержит один метод, например valueChange(Event ev).
То есть, любой объект, который хочет узнавать о событии (заинтересованный объект) должен имплементировать интерфейс ChangeListener, переопределяя его valueChange(Event ev) своей собственной реакцией на событие.
Все эти заинтересованные объекты должны зарегистрироватья у источника событий, то есть попросту нужно вызвать у 
этого самого источника addChangeListener(ChangeListener listener) для каждого слушателя (читай занитересованного объекта) -- иначе говоря добавить слушателей.
Самому источнику по барабану, кто его слушает, ему достаточно знать что все они реализуют интерфейс ChangeListener, а значит их можно к нему откастить и вызвать у них valueChange(Event ev). Он сделал свое дело (которого все ждут), пробежался по списку слушателей и повызывал у всех valueChange(Event ev)... -- получилось, что реакция на событие у всех слушателей отработла и все довольны.
Фуухх.. объяснятель из меня, конечно, не очень, но уж как смог...  smile 

PM MAIL   Вверх
hamsterKSU
Дата 5.4.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

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



addxxxListener можно вызывать сколько угодно раз. у тя ж там будет список слушателей, вот ты будешь проходить по этому списку и вызывать у них метод заявленый в интерфейсе
PM MAIL ICQ   Вверх
sith
Дата 5.4.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это вроде бы мне ясно... но есть НО которое не укладываеться в моей голове...
... вот мой класс Х который никакого отношения не имеет к обьекту которого хочет слушать... реализует нужный интерфейс... а как мне в этом классе  добавить слушателя...  тоесть как вызвать  addXxxListener оъекта  in которого хочу слушать что бы зарегистрировать слушателя...?

Добавлено через 6 минут и 16 секунд
LSD как получить ссылку на обьект не создавая его...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
nornad
Дата 5.4.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(sith @  6.4.2007,  00:26 Найти цитируемый пост)
LSD как получить ссылку на обьект не создавая его... 

Ну ты загнул smile
Цитата(sith @  6.4.2007,  00:26 Найти цитируемый пост)
а как мне в этом классе  добавить слушателя...  тоесть как вызвать  addXxxListener оъекта  in которого хочу слушать что бы зарегистрировать слушателя...?

Или ты таки не понял сути идеи, или объясняешь как проктолог.
Смотри, модель такая:
Есть класс А, который реализует интерфейс В.
Интерфейс В служит для определения колбэк-методов, которые вызываются при возникновении интересных тебе событий.
Есть класс С, который имеет список листенеров (ссылок на В). Он же реализует у себя методы addXxxListener и removeXxxListener.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
sith
Дата 5.4.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



можно код... smile 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
nornad
Дата 5.4.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Блин, ну это же элементарно. Всего-то надо один раз прочитать статейку или посмотреть, как это реализовано в той же жабе.
Код

interface B {
  public void processMyEvent();
}

class A implements B {
  public void processMyEvent() {
    // do something
  }
}

class C {
  private List<B> myEventListeners = new ArrayList<B>();

  public void addMyEventListener( B listener ) {
    myEventListeners.add( listener );
  }

  public void removeMyEventListener( B listener ) {
    myEventListeners.remove( listener );
  }
}

Теперь-то хоть понятно?


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
sith
Дата 5.4.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nornad... не чувак... мне кажеться мы говорим о разных вещах...
... все это LSD описал в предыдущей теме и это мне понятно...
... мне не понятно другое... вот получаеться так что в классе C есть какоето поле допустим значение которого я хочу прослушивать... и при изменении его нужно что бы все слушатели получали его...
... как это будет выглядеть в мэйн методе...
... как мне добавить класс  А как слушателя класса С

Добавлено через 7 минут и 24 секунды
и почему у тебя в приведенном примере нет класса у которого в предках стоит  EventObject, у LSD было так...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
nornad
Дата 5.4.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(sith @  6.4.2007,  02:10 Найти цитируемый пост)
nornad... не чувак... 

Хой, пипл. Я в курсе, что я не чувак.  smile 

Цитата(sith @  6.4.2007,  02:10 Найти цитируемый пост)
и почему у тебя в приведенном примере нет класса у которого в предках стоит  EventObject, у LSD было так...

Потому что в упрощённом варианте он не требуется. С ним правильнее, но и без него работать будет.

Теперь по твоему вопросу. В примере, который я привёл действительно А слушает С, а не наоборот. Извини, что ввёл в заблуждение.
Вот что надо добавить, чтобы при возникновении некоторого события все слушатели срабатывали на него:
Код

class C {
  ...
  public void setMiscField( int val ) {
    this.miscField = val;
    fireMyEvent();
  }

  private void fireMyEvent() {
    for( B listener : myEventListeners )
      listener.processMyEvent();
  }
}

В мэйне будет что-то вроде такого:
Код

public static void main( String[] args ) {
  C c = new C();
  A a = new A();
  c.addMyEventListener( a );
  c.setMiscField( 10 );
}


Это сообщение отредактировал(а) nornad - 6.4.2007, 00:17


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
hamsterKSU
Дата 6.4.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

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



Цитата(sith @  5.4.2007,  22:10 Найти цитируемый пост)
и почему у тебя в приведенном примере нет класса у которого в предках стоит  EventObject, у LSD было так... 

потомучто он тебе обяснял про Listпро  а не про событие

Добавлено через 5 минут и 11 секунд
Цитата(sith @  5.4.2007,  22:10 Найти цитируемый пост)
.. как мне добавить класс  А как слушателя класса С

блин ты либо не доганяешь либо не хочешь догнать

у класса С должен быть методы addXXXListener(Listener e) 
класс А реализует интерфейс слушателя событий от класса С
тогда 
Код

С cObj = new C();
A a = new A();
cObj.addXXXListener(a);

вот и все чего тут не понятно или никто не может понять что ты хочешь и прочитай статьи на которые я тебе указал. там все описано тем более что LSD тоже тебе рассказывал
PM MAIL ICQ   Вверх
nornad
Дата 6.4.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(hamsterKSU @  6.4.2007,  03:00 Найти цитируемый пост)
блин ты либо не доганяешь либо не хочешь догнать

Скорее второе, ибо уже давно можно было и статейку прочесть и в жабе посмотреть на добавление слушателя к любому гуёвому классу - сырцы не так уж далеко запрятали.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
hamsterKSU
Дата 6.4.2007, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

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



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

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

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


 




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


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

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