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

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

хм, по-простому для начала
...
Рейтинг: 0 / 0
Сообщение от одного jintrenalframe другому
    #37988423
jcob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый фрейм может получить от второго некий объект и в зависимости от сотояния объекта должен как-то отреагировать.
...
Рейтинг: 0 / 0
Сообщение от одного jintrenalframe другому
    #37988436
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Сообщение от одного jintrenalframe другому
    #37988534
jcob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

да к такому уродству я и сам пришел , а мне надо более элегантное решение
...
Рейтинг: 0 / 0
Сообщение от одного jintrenalframe другому
    #37988576
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Сообщение от одного jintrenalframe другому
    #37988736
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как я иногда люблю заниматься ерундой, за что начальство меня сильно любит, то вам вам велосипед, чтобы не сильно менять "структуру" вашего проекта:

Код: 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
Сообщение от одного jintrenalframe другому
    #37988761
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notifyAll - не очень удачное имя для метода
...
Рейтинг: 0 / 0
Сообщение от одного jintrenalframe другому
    #37988763
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никnotifyAll - не очень удачное имя для метода

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

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

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

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

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

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


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

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


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