Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Предедача событий между JFrame? / 24 сообщений из 24, страница 1 из 1
11.05.2012, 13:08:33
    #37789232
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
Доброго времени суток.

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

У меня есть главный класс (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
11.05.2012, 13:16:01
    #37789253
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
HunterNomadЯ раньше не занимался разработкой десктопных приложений, и возможно вопрос, по сему не корректно составлю.

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

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

Вы ожидаете что значение свойства из второго экземпляра какой-то магией должно попасть в первый?
...
Рейтинг: 0 / 0
11.05.2012, 13:20:58
    #37789263
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
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
11.05.2012, 13:26:59
    #37789281
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
Слово "экземпляр" вам о чем-то вообще говорит? Забудьте про 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
11.05.2012, 13:38:06
    #37789322
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
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
11.05.2012, 13:38:51
    #37789323
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
HunterNomadnull выводит.
Почему?
...
Рейтинг: 0 / 0
11.05.2012, 13:41:11
    #37789333
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
BlazkowiczHunterNomadnull выводит.
Почему?
А что он, по Вашему, должен вывести?
Прошу прошение приведите полный пример Holder.
...
Рейтинг: 0 / 0
11.05.2012, 13:43:41
    #37789338
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
HunterNomadА что он, по Вашему, должен вывести?
На вопрос "что" мы уже ответили. Остался вопрос "почему". Когда вы ответите на вопрос "почему", то спроецируйте Holder на JFrame:
замените Holder на JFrame
"text =" на "setTextF("
...
Рейтинг: 0 / 0
11.05.2012, 13:49:17
    #37789355
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
Blazkowicz,

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

Код: 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
11.05.2012, 16:38:27
    #37789731
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
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
11.05.2012, 16:47:25
    #37789748
1024
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
...
Рейтинг: 0 / 0
11.05.2012, 16:53:24
    #37789762
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
1024какие нахер модели с биндингами. Вот тут ты создаёшь экземпляр класса JFrame2 окошко т.е.) и делаешь его видимым. Вот тут ты тоже создаёшь новый экземпляр своего окошка. И меняешь у него текст. То окошко которое ты создал первой кнопкой конечно никакой текст менять не будет. Ты к нему не обращаешься.
Автор, вроде, разобрался уже. Спрашивает как сделать лучше.
...
Рейтинг: 0 / 0
11.05.2012, 16:53:39
    #37789765
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
1024какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
По делу есть что сказать?
...
Рейтинг: 0 / 0
11.05.2012, 17:02:22
    #37789784
1024
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
Blazkowicz1024какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
По делу есть что сказать?

я уже сказал
...
Рейтинг: 0 / 0
11.05.2012, 17:03:20
    #37789788
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
1024Blazkowicz1024какой ужас. Так вместо писания программ получится писание фреймворков. Деньги-то за что платить тебе будут?
По делу есть что сказать?
я уже сказал
ОК
...
Рейтинг: 0 / 0
11.05.2012, 17:14:10
    #37789806
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
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
11.05.2012, 17:23:57
    #37789828
KurtBeard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
А можно я попытаюсь объяснить как это просто реализовано в 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
11.05.2012, 17:48:46
    #37789864
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
HunterNomadа не сексование мозга.
Всегда пожалуйста. Надеюсь мозг не сильно пострадал?
...
Рейтинг: 0 / 0
11.05.2012, 17:53:17
    #37789871
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
KurtBeard,
Вот еще один пример правильного ответа. Спасибо.
Действительно просто и понятно, а RCP я на заметку взял.
...
Рейтинг: 0 / 0
11.05.2012, 17:54:25
    #37789878
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предедача событий между JFrame?
BlazkowiczHunterNomadа не сексование мозга.
Всегда пожалуйста. Надеюсь мозг не сильно пострадал?
Не, не сильно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Предедача событий между JFrame? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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