Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сообщение от одного jintrenalframe другому / 19 сообщений из 19, страница 1 из 1
08.10.2012, 15:02:44
    #37988355
jcob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Есть два jintrenalframe как из одного из них послать сообщение второму о том что произошло какое-то событие?
...
Рейтинг: 0 / 0
08.10.2012, 15:06:19
    #37988366
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
jintrenalframe это просто некоторый View. Для модели предметной области. Вам действительно нужно послать AWT Event, или достаточно из одного класса вызвать метод другого класса?
...
Рейтинг: 0 / 0
08.10.2012, 15:12:16
    #37988388
jcob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Blazkowicz,

Скажем так, первый фрейм должен отреагировать на событие во втором фрейме, например нажатие кнопки, или закрытие второго фрейма.
...
Рейтинг: 0 / 0
08.10.2012, 15:14:25
    #37988393
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
jcobСкажем так, первый фрейм должен отреагировать на событие во втором фрейме, например нажатие кнопки, или закрытие второго фрейма.
Вам сразу по-хорошему с дизайном и слоями, или просто чтобы работало (передать ссылку на один объект в другой объект)?
...
Рейтинг: 0 / 0
08.10.2012, 15:20:22
    #37988412
jcob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Blazkowicz,

хм, по-простому для начала
...
Рейтинг: 0 / 0
08.10.2012, 15:26:26
    #37988423
jcob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Первый фрейм может получить от второго некий объект и в зависимости от сотояния объекта должен как-то отреагировать.
...
Рейтинг: 0 / 0
08.10.2012, 15:30:43
    #37988436
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public class FrameA extends JInternalFrame{
  
   public void onButtonClick(){
         System.out.println("Gotcha!");
   }

}


public class FrameB extends JInternalFrame{

  private FrameA frameA;  

  void initUI(){
          button.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent ae){
                              frameA.onButtonClick();
                   }
          });

  }

  public void setFrameA(FrameA frameA){
       this.frameA = frameA;
  }
}

//Main...

FrameA frameA = new FrameA();
FrameB frameB = new FrameB();
frameB.setFrameA(frameA);



Но на будущее знайте, что это уродство. Нужно уметь отделять слои приложения.
...
Рейтинг: 0 / 0
08.10.2012, 15:58:35
    #37988534
jcob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Blazkowicz,

да к такому уродству я и сам пришел , а мне надо более элегантное решение
...
Рейтинг: 0 / 0
08.10.2012, 16:15:52
    #37988576
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
jcobда к такому уродству я и сам пришел , а мне надо более элегантное решение
Ну, это прямой ответ на ваш изначальный вопрос. Новички тут его регулярно задают.
Более элегантное решение заключается в отделении View и Model и привлечении технологии JavaBeans.
View это всё то что относиться к Swing компанентам (ваш internal frame). Задача View - отбражать актуальное сосояние Model.
Model - это некоторая ваша Domain Model. Класс отражающий предметную область. По технологии JavaBeans он должен предоставлять возможность вешать PropertyChangeListener-ы (можно через PropertyChangeSupport)

Когда состояние Model меняется, то Model выкидывает событие PropertyChangeEvent, а все слушатели (internal frame) обновляют отображение (View) модели.
Модель может пересекатся с Model классами Swing, такими как TableModel. Как это реализовать, возможны разные варианты.

Если всему этому следовать, то получится следующий механизм.
FrameA и FrameB имеют ссылку на одну и ту же модель, так как являются её отображениями.
Когда на FrameA нажимают кнопку, он меняет состояние модели (устанавливает новое значение какого-либо свойства).
Модель оповещает всех своих слушателей через firePropertyChange (см PropertyChangeSupport). Оба FrameA и FrameB получают это событие и обновляют своё отображение.

В этом случае FrameA и FrameB ничего не знают друг про друга. И модель отделена от представления.
...
Рейтинг: 0 / 0
08.10.2012, 17:16:49
    #37988736
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Так как я иногда люблю заниматься ерундой, за что начальство меня сильно любит, то вам вам велосипед, чтобы не сильно менять "структуру" вашего проекта:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
public interface EventObserver {
    void event();
}


public interface EventObserverManager {
    void registerEventObserver(Class clazz, EventObserver eventObserver);
    void removeEventObserver(Class clazz, EventObserver eventObserver);
    void notifyAll(Class clazz);
}

public class EventObserverManagerImpl implements EventObserverManager {
    private final Map<Class, Set<EventObserver>> observersMap = new HashMap<Class, Set<EventObserver>>();

    @Override
    public void registerEventObserver(Class clazz, EventObserver eventObserver) {
        getObserverSet(clazz).add(eventObserver);
    }

    @Override
    public void removeEventObserver(Class clazz, EventObserver eventObserver) {
        remoteObserver(clazz, eventObserver);
    }

    @Override
    public void notifyAll(Class clazz) {
        for (EventObserver eventObserver : observersMap.get(clazz)) {
            eventObserver.event();
        }
    }

    //----------------------------------------------------
    public void click(Class clazz) {
        notifyAll(clazz);
    }

    //----------------------------------------------------
    private Set<EventObserver> getObserverSet(Class clazz) {
        Set<EventObserver> result = observersMap.get(clazz);
        if (result == null) {
            result = new HashSet<EventObserver>();
            observersMap.put(clazz, result);
        }
        return result;
    }

    private void remoteObserver(Class clazz, EventObserver eventObserver) {
        Set<EventObserver> observerSet = getObserverSet(clazz);
        if (observerSet.contains(eventObserver)) {
            observerSet.remove(eventObserver);
        }
    }
}

public class Frame1 extends JFrame {
    public Frame1(final EventObserverManager eventObserverManager) {
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JButton button = new JButton("iButton");
        ActionListener actionListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                eventObserverManager.notifyAll(Frame1.class);
            }
        };
        button.addActionListener(actionListener);
        add(button);
    }
}

public class Frame2 extends JFrame implements EventObserver {
    private final JTextArea jTextArea;

    public Frame2(final EventObserverManager eventObserverManager) {
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        eventObserverManager.registerEventObserver(Frame1.class, this);
        jTextArea = new JTextArea();
        jTextArea.setText(String.valueOf(System.currentTimeMillis()));
        add(jTextArea);
    }

    @Override
    public void event() {
        jTextArea.setText(String.valueOf(System.currentTimeMillis()));
    }
}

public class Start {
    public static void main(String[] args) {
        EventObserverManager eventObserverManager = new EventObserverManagerImpl();
        Frame1 frame1 = new Frame1(eventObserverManager);
        Frame2 frame2 = new Frame2(eventObserverManager);
    }
}



Другими словами, мы подписываемся любимыми элементами вашего проекта на все события нужного вам класса $) Применен чуть чуть видоизмененный классический шаблон Observer
...
Рейтинг: 0 / 0
08.10.2012, 17:25:31
    #37988761
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
notifyAll - не очень удачное имя для метода
...
Рейтинг: 0 / 0
08.10.2012, 17:27:04
    #37988763
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
забыл никnotifyAll - не очень удачное имя для метода

Ну тут вообще велосипед..ну да, неудачного тут много ;)
...
Рейтинг: 0 / 0
08.10.2012, 17:32:46
    #37988777
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
ОзверинТак как я иногда люблю заниматься ерундой, за что начальство меня сильно любит, то вам вам велосипед, чтобы не сильно менять "структуру" вашего проекта:

java.util.Observable на новый лад?
...
Рейтинг: 0 / 0
08.10.2012, 17:35:36
    #37988782
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
BlazkowiczОзверинТак как я иногда люблю заниматься ерундой, за что начальство меня сильно любит, то вам вам велосипед, чтобы не сильно менять "структуру" вашего проекта:

java.util.Observable на новый лад?

Точно. Только он там сихнронизированный, что меня всегда настораживало;)
...
Рейтинг: 0 / 0
08.10.2012, 17:40:12
    #37988796
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
ОзверинТочно. Только он там сихнронизированный, что меня всегда настораживало;)
Да. В GUI это страаашно влияет на производительность. Особенно в Java 7.
...
Рейтинг: 0 / 0
08.10.2012, 18:05:05
    #37988853
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
BlazkowiczОзверинТочно. Только он там сихнронизированный, что меня всегда настораживало;)
Да. В GUI это страаашно влияет на производительность. Особенно в Java 7.

Учитывая, что топик вовсе не про гуи, а про какие-то абстрактные сообщения между фреймами...;)
...
Рейтинг: 0 / 0
08.10.2012, 18:46:45
    #37988898
jcob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Спасибо всем за ответы, буду вникать.
...
Рейтинг: 0 / 0
08.10.2012, 23:00:33
    #37989175
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Blazkowiczкомпанентам
твою ж налево. опять.
...
Рейтинг: 0 / 0
09.10.2012, 14:12:29
    #37990045
ResidentR6
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сообщение от одного jintrenalframe другому
Там есть конкретные СЛУШАТЕЛИ на конкретные РАСПРОСТРАНЁННЫЕ события.
Свойственные именно JInternalFrame. Посмотри в его документацию, не ленись.

Не парься с обработкой ВСЕХ событий - это велосипед.


Лично мне приходилось писать свой "модальный" JInternalFrame, который на
время своей работы блокировал некоторые другие фреймы. И решалось всё в
лоб, через слушатели.

Легче всего создать СВОЙ СОБСТВЕННЫЙ класс-наследник JInternalFrame,
который будет вести себя так, как ты хочешь. И уже его брать за основу
своих форм. Удобство в том, что если вдруг чего добавить, заменить, или
глюки найдёшь - меняется в одной точке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Сообщение от одного jintrenalframe другому / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]