Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > данные из Jframe<->Jdialog и обра


Автор: Sibir 26.3.2012, 20:30
Всем привет, сразу перейду к делу.
Есть  класс 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); 
            }});
      }


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

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

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

к коду сильно не придирайтесь, он в качестве примере. И при разъяснении можно привести маленький пример для более лучшего понимания. 

Автор: Sibir 27.3.2012, 13:05
Как я понял над этой темой не задумывались. Поэтому нашел ответ сам 

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);

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

Автор: jk1 27.3.2012, 23:31
Цитата

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


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

Автор: Mirkes 28.3.2012, 02:56
Цитата(jk1 @ 27.3.2012,  23:31)
Цитата

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


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

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

Автор: Sibir 28.3.2012, 05:29
Listener для уведомления заинтересованных компонентов

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

Автор: jk1 29.3.2012, 08:47
Цитата

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 получает нотификацию о закрытии диалога. При её получении можно снять с диалога все необходимые данные.

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

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

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

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

Автор: Sibir 31.3.2012, 10:46
Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)