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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> данные из Jframe<->Jdialog и обра 
V
    Опции темы
Sibir
Дата 26.3.2012, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет, сразу перейду к делу.
Есть  класс ShowConfigSubFrame extends JFrame

Код

public void ShowConfigSubFrame extends JFrame{

          public ShowConfigSubFrame(){
                   initComponents();
                   ppppp();
          }
          
// какой то код

      public void setDataServer(){
        
        showButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                
                 DVOwin dvo = new  DVOwin(z, std); //Тут передаются данные в конструкторе

            }});
    }

// какой то код

          public void tttttt(String stp){


          }
}




класс DVOwin extends javax.swing.JDialog

Код

public class DVOwin extends javax.swing.JDialog {

     public String stdvo, sendForShowConfigSubFrame;
     public int idvo;


     public DVOwin(int i , String st){
            stdvo=st;
            idvo = i;
            initComponents();
            eeeee(idvo , stdvo);
             setData();
     }

     public voide eeeee(int y, String ts){
        // что то делается.
        sendForShowConfigSubFrame = результат.
     }

     public void setData(){
        
        returnButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                
                 sendForShowConfigSubFrame    //значение этой переменой мне надо вернуть обратно в ShowConfigSubFrame 
                                                                     и не просто передать а так что бы оно выполнилось в   public void tttttt(String stp)
            }});
      }

}


 
вот в чем вопрос у меня есть основной класс ShowConfigSubFrame extends JFrame, он же реализует main и в нем же выводятся все данные, так же с него начинается как вы поняли загрузка. 

Так вот при нажатии кнопки в ShowConfigSubFrame определены данные передаются в конструкторе  для DVOwin, он так же имеет некоторые элементы вода с клавиатуры и так же в DVOwin проводятся некоторые вычисления. После всех операций надо вернуть получены данные обратно в ShowConfigSubFrame в  public void tttttt(String stp), но в чем вопрос как....

если вызвать такой метод ShowConfigSubFrame scsf = new ShowConfigSubFrame();  scsf.ttttt(String stp)  в  DVOwin, то так получится не правильно,   так как класс  ShowConfigSubFrame уже загружен и этот метод вызавит конструктор по умолчанию и переопределит все переменные и появится новое Jframe ShowConfigSubFrame, 
перегрузить конструктор ShowConfigSubFrame(String st), то же не вариант так как переменные та же переопределяется.

знаю что в классе ShowConfigSubFrame можно было сделать так:

Код

    dvo. returnButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                
                  tttttt(dvo.sendForShowConfigSubFrame); 
            }});
      }


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

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

вопрос как передать данные в основной класс ?????

к коду сильно не придирайтесь, он в качестве примере. И при разъяснении можно привести маленький пример для более лучшего понимания. 
PM MAIL   Вверх
Sibir
Дата 27.3.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как я понял над этой темой не задумывались. Поэтому нашел ответ сам 

Singleton


сейчас работает все как хотел 

в ShowConfigSubFrame сделал так:
 
Код


private static ShowConfigSubFrame scsf;

private ShowConfigSubFrame(){

            scsf = new ShowConfigSubFrame();
}

public static synchronized ShowConfigSubFrame getInstance(){
           return (scsf == null) ? new ShowConfigSubFrame() : scsf;
    }


а в классеDVOwin extends javax.swing.JDialog

Код

ShowConfigSubFrame.getInstance().tttttt(String stp);

PM MAIL   Вверх
Mirkes
Дата 27.3.2012, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 17



Я в таких случаях не передавал данные в основной класс, а выставлял классу флаг, что данные можно забирать. Главный класс время от времени проверял свой флаг, и обнаружив готовность забирал.
Если же речь идет о диалогах (модальных окнах) то сразу после открытия модального окна проаерялся способ его закрытия и если это кнопка Ок, то данные забирались у диалога. Слова "сразу после" означают, что поскольку диалог - модальное окно, то оператор, следующий за setVisible(true) выполнится только после закрытия диалога.


--------------------
Mirkes
PM MAIL   Вверх
jk1
Дата 27.3.2012, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Цитата

 Главный класс время от времени проверял свой флаг, и обнаружив готовность забирал.


Это решение идет вразрез со всей архитектурой Swing. Тут либо Singleton, как уже сам догадался Sibir, либо Listener для уведомления заинтересованных компонентов, либо (и это самый простой вариант) передача в конструктор диалога ссылки на фрейм. Как только диалог сделает все, что требуется, он просто дернет у фрейма метод и передаст ему данные. 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Mirkes
Дата 28.3.2012, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 17



Цитата(jk1 @ 27.3.2012,  23:31)
Цитата

 Главный класс время от времени проверял свой флаг, и обнаружив готовность забирал.


Это решение идет вразрез со всей архитектурой Swing. Тут либо Singleton, как уже сам догадался Sibir, либо Listener для уведомления заинтересованных компонентов, либо (и это самый простой вариант) передача в конструктор диалога ссылки на фрейм. Как только диалог сделает все, что требуется, он просто дернет у фрейма метод и передаст ему данные.

Я описал два решения, которые я использовал.
Вариант с флагом я использовал для диалога типа "прогресс бар", который отображал процес счета другим потоком и отчасти им (счетом) управлял. Возможно это и противоречит идеологии Swing, не берусь сказать.
Для нормального модального диалога я использовал второй из описанных вариантов - основной класс забирал данные у диалога после закрытия. Это, по-моему, самое простое решение. И не нужно передавать ссылку на главный класс в диалог.
Предложенный jk1 вариант со ссылкой тоже простой. Но мне не понятны его преимущества перед вариантом, в котором данные забирает сам главный класс, запустивший диалог. Разве что диалог запускается в отдельном потоке.


--------------------
Mirkes
PM MAIL   Вверх
Sibir
Дата 28.3.2012, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Listener для уведомления заинтересованных компонентов

jk1 а можешь уточнить это высказывание или привести пример в моем случаи, Listener должен находится в DVOwin extends javax.swing.JDialog ?????
PM MAIL   Вверх
jk1
Дата 29.3.2012, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Цитата

jk1 а можешь уточнить это высказывание или привести пример в моем случаи, Listener должен находится в DVOwin extends javax.swing.JDialog ????? 


Накидал небольшой пример с listener'ом для наглядности
Код

public class Frame  extends JFrame implements ActionListener{
    public Frame() throws HeadlessException {
        this.setBounds(100,100,100,100);
        JButton button  = new JButton("Show dialog");
        button.addActionListener(this);
        this.getContentPane().add(button);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JDialog dialog = new JDialog();
        dialog.setBounds(120,120,50,50);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("Dialog has been closed");
            }
        });
        System.out.println("Dialog has been opened");
        dialog.setVisible(true);
    }

    public static void main(String[] args) {
        Frame frame = new Frame();
        frame.setVisible(true);
    }
}

Тут видно, как frame получает нотификацию о закрытии диалога. При её получении можно снять с диалога все необходимые данные.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Mirkes
Дата 29.3.2012, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 17



Прошу прощения чт влезаю в обсуждение, но мне действительно интересно, почему неправилно поступать следующим образом:
Код

    public void paramExec() {
        paramSet(); // установка данных в диалог md
        md.setVisible(true);  // открытие диалога
        while (md.isOk()) { 
            if (paramGet())  // считывание данных и проверка корректности
                break;
            md.setVisible(true);
        }
        drawState();  // отрисовка с новыми параметрами.
    }

Это кусок рабочего кода. paramExec вызывается из обработки события нажатия кнопки.
В методе крутится цикл до тех пор пока пользователь не введет корректные данные или откажется от редактирования параметров.

В чем недостаток, некорректность такого подхода?


--------------------
Mirkes
PM MAIL   Вверх
Sibir
Дата 31.3.2012, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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