powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Предедача событий между JFrame?
24 сообщений из 24, страница 1 из 1
Предедача событий между JFrame?
    #37789232
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Я раньше не занимался разработкой десктопных приложений, и возможно вопрос, по сему не корректно составлю.

У меня есть главный класс (frameToframe.java)

frameToframe (frameToframe.java)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class frameToframe {

    public static void main(String[] args) {
        // TODO code application logic here
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JFrame1().setVisible(true);
            }
        });
    }
}



Как вы поняли при старте он запускает форму JFrame1 (JFrame1.java) с двумя кнопками.
Первая jButton1, как видно, из листинга, открывает JFrame2 (JFrame2.java листинг ниже).
Вторая, через метод setTextF() как бы должна присвоить текстовому полю jTextField1(в JFrame2) некий текст.
Но увы, никто никуда ни едет.

JFrame1 (JFrame1.java)
Код: 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.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author user
 */
public class JFrame1 extends javax.swing.JFrame {

    /**
     * Creates new form JFrame1
     */
    public JFrame1() {
        initComponents();
        jButton1.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                java.awt.EventQueue.invokeLater(new Runnable() {
                    
                    public void run() {
                        new JFrame2().setVisible(true);
                    }
                });
            }
        });
        
        jButton2.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame2 jf2 = new JFrame2();
                jf2.setTextF("Hello, World");
            }
        });
       ........

  }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    // End of variables declaration
}
    }



JFrame2 (JFrame2.java)
Код: 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.
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author user
 */
public final class JFrame2 extends javax.swing.JFrame {

    public void setTextF(String str) {
        jTextField1.setText(str);
    }

    /**
     * Creates new form JFrame2
     */
    public JFrame2() {
        initComponents();
    
    }
.....

// Variables declaration - do not modify
    private javax.swing.JTextField jTextField1;
    // End of variables declaration
}



Вот теперь ВОПРОС: есть ли способ передать событие из JFrame1 в JFrame2 и присвоить таки
полю jTextField1 "Hello, World".
Вообще мне нужно, по условию задачи, добавлять нажатием кнопки из JFrame1 в JFrame2 закладки (jTabbedPane). Но хотел сначала разобраться с механизмом.

Я не прошу делать решение за меня, просто подскажите где копать, а там я и сам вшарюсь.
И самое главное возможно - я работаю в NetBeans и формы создавал в нем.

Удачных удач всем.
И за ранее спасибо.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789253
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadЯ раньше не занимался разработкой десктопных приложений, и возможно вопрос, по сему не корректно составлю.

Десктопные приложения тут не причем. У вас какое-то недопонимание что такое объект вообще.
Создаём первый экземпляр. Устанавливаем свойство.
new JFrame2().setVisible(true);

Создаём второй экземпляр. Устанавливаем свойство.
JFrame2 jf2 = new JFrame2();
jf2.setTextF("Hello, World");

Вы ожидаете что значение свойства из второго экземпляра какой-то магией должно попасть в первый?
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789263
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHunterNomadЯ раньше не занимался разработкой десктопных приложений, и возможно вопрос, по сему не корректно составлю.

Десктопные приложения тут не причем. У вас какое-то недопонимание что такое объект вообще.
Создаём первый экземпляр. Устанавливаем свойство.
new JFrame2().setVisible(true);

Создаём второй экземпляр. Устанавливаем свойство.
JFrame2 jf2 = new JFrame2();
jf2.setTextF("Hello, World");

Вы ожидаете что значение свойства из второго экземпляра какой-то магией должно попасть в первый?
Зачем магически.
setTextF() - метод из JFrame2, и с его помощью и думал и произвести изменения.
Собственно вот его объявление во JFrame2.
Код: java
1.
2.
3.
public void setTextF(String str) {
        jTextField1.setText(str);
    }


Или я чего та не до понял ?
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789281
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слово "экземпляр" вам о чем-то вообще говорит? Забудьте про JFrame. Вот пример. Что выведет?

Код: java
1.
2.
3.
4.
5.
6.
7.
class Holder{
  String text;
}

Holder h = new Holder();
new Holder().text = "New Text";
System.out.println(h.text);
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789322
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczСлово "экземпляр" вам о чем-то вообще говорит? Забудьте про JFrame. Вот пример. Что выведет?

Код: java
1.
2.
3.
4.
5.
6.
7.
class Holder{
  String text;
}

Holder h = new Holder();
new Holder().text = "New Text";
System.out.println(h.text);



null выводит.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789323
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadnull выводит.
Почему?
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789333
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHunterNomadnull выводит.
Почему?
А что он, по Вашему, должен вывести?
Прошу прошение приведите полный пример Holder.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789338
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadА что он, по Вашему, должен вывести?
На вопрос "что" мы уже ответили. Остался вопрос "почему". Когда вы ответите на вопрос "почему", то спроецируйте Holder на JFrame:
замените Holder на JFrame
"text =" на "setTextF("
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789355
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Спасибо :-)
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789502
KurtBeard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На java ничего кроме как "Hello, world" не написал, поэтому, может быть, буду и неправ....
Раз вы используете IDE NetBeans и пишете десктоп приложение, может сразу использовать RCP встроенное в IDE?
Ведь все равно надо будет хранить ссылки на открытые окна, создавать связи между ними, а там уже все это реализовано.
И чуть ли не по всем примерам "красной нитью" проходит обработка событий в окнах.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789517
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KurtBeardНа java ничего кроме как "Hello, world" не написал, поэтому, может быть, буду и неправ....
Раз вы используете IDE NetBeans и пишете десктоп приложение, может сразу использовать RCP встроенное в IDE?
Ведь все равно надо будет хранить ссылки на открытые окна, создавать связи между ними, а там уже все это реализовано.
И чуть ли не по всем примерам "красной нитью" проходит обработка событий в окнах.
По-нормальному это всё решается через модель и биндинг. UI биндится на модель. А всё состояние меняется исключительно в модели. Но вы правы в том что не нужно никаких событий передавать из пункта А в пункт B. Это попахивает.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789689
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz ...
По-нормальному это всё решается через модель и биндинг. UI биндится на модель. А всё состояние меняется исключительно в модели. Но вы правы в том что не нужно никаких событий передавать из пункта А в пункт B. Это попахивает.
Чего я и просил.
Я просил поведать тайные знания, вернее название сего тайного знания - "через модель и биндинг. UI биндится на модель" .
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789725
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какие нахер модели с биндингами. Вот тут

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
jButton1.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                java.awt.EventQueue.invokeLater(new Runnable() {
                    
                    public void run() {
                        new JFrame2().setVisible(true);
                    }
                });
            }
        });



ты создаёшь экземпляр класса JFrame2 окошко т.е.) и делаешь его видимым. Вот тут
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
jButton2.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame2 jf2 = new JFrame2();
                jf2.setTextF("Hello, World");
            }
        });



ты тоже создаёшь новый экземпляр своего окошка. И меняешь у него текст. То окошко которое ты создал первой кнопкой конечно никакой текст менять не будет. Ты к нему не обращаешься.

Учебник надо почитать.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789731
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadЯ просил поведать тайные знания, вернее название сего тайного знания - "через модель и биндинг. UI биндится на модель" .
Просто следуйте концепции Swing. Есть модель - некий контейнер с данными (TableModel, ListModel, TreeModel). Модель рассылает события. Смотрите AbstractTableModel, например. UI - ловит эти события и перечитывает данные из модели.

События для модели реализуются левой пяткой через биндинг. Не знаю что там в NetBeans за движок. В WindowBuilder Pro используется Better Beans Binding.

Для своей задачи делаем модель JavaBean. Можно PropertyChangeListener самому реализовать. Можно добавить искуственно. Есть варианты разные, например, PropertyChangeSupport.

Потом это всё работает так.
- У кнопки есть Action.
- Action вызывает model.setValue();
- model нотифицирует всех своих PropertyChangeListener - элементы UI.
- Элементы UI читают model.getValue() и показвыют новое значение.

Последние два пункта через биндинг делаются минимумом кода.
Бенефитов у этого подхода масса. Все данные в одном месте. Их легко сериализовать. Заменить. Обновить.
Разный UI использует одну и ту же модель. Не нужно заботиться о передаче данных между элементами UI. UI всегда показывает то что в модели. На любое свойство можно навесить кучу элементов.

Тут хорошо концепцию понять. Далеко всё можно забиндить. Но можно реализовать через PropertyChangeListener такие механизмы самому. Код становится не реально простой.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789748
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789762
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024какие нахер модели с биндингами. Вот тут ты создаёшь экземпляр класса JFrame2 окошко т.е.) и делаешь его видимым. Вот тут ты тоже создаёшь новый экземпляр своего окошка. И меняешь у него текст. То окошко которое ты создал первой кнопкой конечно никакой текст менять не будет. Ты к нему не обращаешься.
Автор, вроде, разобрался уже. Спрашивает как сделать лучше.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789765
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
По делу есть что сказать?
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789784
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz1024какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
По делу есть что сказать?

я уже сказал
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789788
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024Blazkowicz1024какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
По делу есть что сказать?
я уже сказал
ОК
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789806
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024какие нахер модели с биндингами. Вот тут

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
jButton1.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                java.awt.EventQueue.invokeLater(new Runnable() {
                    
                    public void run() {
                        new JFrame2().setVisible(true);
                    }
                });
            }
        });



ты создаёшь экземпляр класса JFrame2 окошко т.е.) и делаешь его видимым. Вот тут
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
jButton2.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame2 jf2 = new JFrame2();
                jf2.setTextF("Hello, World");
            }
        });



ты тоже создаёшь новый экземпляр своего окошка. И меняешь у него текст. То окошко которое ты создал первой кнопкой конечно никакой текст менять не будет. Ты к нему не обращаешься.

Учебник надо почитать.

Респект тебе.
Я действительно "закодился" и продрушлял тот очевидный факт, что создавал два разных экземпляра.
Все работает как нужно.
Вот пример правильного ответа на форуме, а не сексование мозга.
Еще раз спасибо.
Дабы закрыть тему и вдруг кому понадобится привожу пример.

JFrame1.java
Код: 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.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JFrame1 extends javax.swing.JFrame {

    JFrame2 jf2 = new JFrame2();
    
    public JFrame1() {
        initComponents();

        jButton1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                jf2.setVisible(true);
            }
        });

        jButton2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                jf2.SetJTextField(jTextField2.getText());
            }
        });
    }
. . .



JFrame2.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class JFrame2 extends javax.swing.JFrame {
    public void SetJTextField(String str){
        jTextField1.setText(str);
    }
    
    public JFrame2() {
        initComponents();
    }
. . .
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789828
KurtBeard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно я попытаюсь объяснить как это просто реализовано в NetBeans?
Там есть некое "хранилище" объектов (Lookup), куда можно "класть" любые объекты.
Ну и само собой, "слушать" эти изменения.
Но поскольку в данном случае мы не используем RCP, то придется реализовывать это хранилище самому:

import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
public class CentralLookup extends AbstractLookup {
private InstanceContent content = null;
private static CentralLookup def = new CentralLookup();

public CentralLookup(InstanceContent content) {
super(content);
this.content = content;
}

public CentralLookup() {
this(new InstanceContent());
}

public static CentralLookup getDefault(){
return def;
}

public void add(Object ob){
content.add(ob);
}

public void remove(Object ob){
content.remove(ob);
}
}

А теперь объявляем слушателя в нашем окне, который генерит события при изменении данных в хранилище.
Обработчиком же события назначаем наше же окно (...implements LookupListener)
import java.util.Collection;
import java.util.Iterator;
import org.openide.util.Lookup;
import org.openide.util.LookupEvent;
import org.openide.util.LookupListener;
public class JFrameLookup extends javax.swing.JFrame implements LookupListener {

private Lookup.Result userInfoResult = null;

/**
* Creates new form JFrameLookup
*/
public JFrameLookup() {
initComponents();

Lookup.Template template = new Lookup.Template(String.class);

CentralLookup cl = CentralLookup.getDefault();
userInfoResult = cl.lookup(template);
userInfoResult.addLookupListener(this);
}

@Override
public void resultChanged(LookupEvent le) {
Object o = le.getSource();
if (o != null) {
Lookup.Result r = (Lookup.Result) o;
Collection infos = r.allInstances();
if (infos.isEmpty()) {
jTextField1.setText("Ничего нет");
} else {
Iterator it = infos.iterator();
while (it.hasNext()) {
Object info = it.next();
jTextField1.setText(info.toString());
}
}
}
}
.....

И теперь, при нажатии кнопки в первом окне
CentralLookup.getDefault().add(jTextField1.getText());

данные попадут в хранилище, ну а во втором окне отобразится этот же текст.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789864
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadа не сексование мозга.
Всегда пожалуйста. Надеюсь мозг не сильно пострадал?
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789871
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KurtBeard,
Вот еще один пример правильного ответа. Спасибо.
Действительно просто и понятно, а RCP я на заметку взял.
...
Рейтинг: 0 / 0
Предедача событий между JFrame?
    #37789878
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHunterNomadа не сексование мозга.
Всегда пожалуйста. Надеюсь мозг не сильно пострадал?
Не, не сильно.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Предедача событий между JFrame?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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