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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача параметров между фреймами!!! 
:(
    Опции темы
suomi
  Дата 5.12.2006, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Народ, вот у меня проблема с передачей данных между фреймами. Есть Фрейм 1 - так текстовое поле textField1 и кнопочка. При нажатии этой кнопочи открывается новый Фрейм 2 - так тоже  текстовое поле textField2 и кнопочка. При нажатии уже этой кнопочки необходимо выполнить присваивание textField1 = textField2 и закрыть Фрем2.
Делаю так, но не получается
Фрейм 1
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Frame1 extends JFrame {
  private JPanel contentPane;
  private BorderLayout borderLayout1 = new BorderLayout();
  private JButton jButton1 = new JButton();
  private JLabel jLabel1 = new JLabel();

  //Construct the frame
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  //Component initialization
  private void jbInit() throws Exception  {
    //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Your Icon]")));
    contentPane = (JPanel) this.getContentPane();
    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    contentPane.setLayout(borderLayout1);
    this.setSize(new Dimension(400, 300));
    this.setTitle("Frame Title");
    jLabel1.setText("jLabel1");
    //jLabel1.setText(Frame2.myTxt.


    contentPane.add(jButton1, BorderLayout.NORTH);
    contentPane.add(jLabel1, BorderLayout.CENTER);
  }
  //Overridden so we can exit when window is closed
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  void jButton1_actionPerformed(ActionEvent e) {
    Frame2 rr = new Frame2();
     this.jLabel1.setText(rr.myTxt.getText());
     System.out.println("label = " + jLabel1.getText());
  }
}


Фрейм 2
Код

import java.awt.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Frame2 extends JFrame {
  private JLabel jLabel1 = new JLabel();
  private JButton jButton1 = new JButton();
   public JTextField myTxt = new JTextField();

  public Frame2() {
    try {
      jbInit();
      this.setVisible(true);
      pack();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    jLabel1.setText("jLabel1");
    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
     public void actionPerformed(ActionEvent e) {
       jButton1_actionPerformed(e);
     }
    });
    this.getContentPane().add(jLabel1, BorderLayout.NORTH);
    this.getContentPane().add(jButton1, BorderLayout.SOUTH);
    this.getContentPane().add(myTxt, BorderLayout.CENTER);

  }

  void jButton1_actionPerformed(ActionEvent e) {
    dispose();
  }
}

public void showLoginScreen(){
    LoginForm loginForm = new LoginForm();
    loginForm.call(this,loginForm);
  }

До недавнего времени проблему я решал так, но посмотрите это не правильно, так как пепедача параметров у меня сопровождается по существу созданием нового Фрейма нового, т.е. есть главный файл Main методы которого служат для построения того или иного фрема

Главный класс GhostBustersMain
Код

package ghostbusters.process;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.IOException;
import java.util.*;
import java.io.File;

import java.io.*;
import java.net.*;

public class GhostBustersMain extends JFrame {
  private GhostBustersService service = new GhostBustersService();
  private Person user;
  //Construct the application
  public GhostBustersMain() {
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    showLoginScreen();
    this.setTitle("GhostBusters");
  }
  public void showLoginScreen(){
    LoginForm loginForm = new LoginForm();
    loginForm.call(this,loginForm);

  public void showVacansyForm(String request) throws SystemException{
   // VacansyForm vacansyForm = new VacansyForm(this,"Processing request",true);
 VacansyForm vacansyForm = new VacansyForm();
   vacansyForm.call(this);
    vacansyForm.showStr(request);
  }

  public void showClientTableForm(){
  ClientTableForm clientTableForm = new ClientTableForm();
  clientTableForm.call(this);
  }
  //Main method
  public static void main(String[] args) {

    new GhostBustersMain();
  }
}



LoginForm.java
Код

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.Document;
import javax.swing.text.AbstractDocument;
import ghostbusters.exception.SystemException;

public class LoginForm extends JFrame{
    JPanel pn = new JPanel();
    JTextField login = new JTextField(10);
    JPasswordField password = new JPasswordField(10);
    JButton btnLogin = new JButton("OK");
    JButton btnExit = new JButton("Exit");


  public LoginForm(){
  }

//экземпляр класса GhostBustersMain передаем  в кач-ве пар-ра!!!
  public void call(final GhostBustersMain parent)
  {
 //   parent.setContentPane(pn);
    this.getContentPane().add(pn);
    pn.setLayout(new BorderLayout());
    getComponents(pn);

    //parent.pack();
    this.pack();
    this.setVisible(true);
    this.setTitle("Authorization");
    //parent.setVisible(true);

    btnLogin.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent evt){
//получаем строку и передаем ее в кач-ве параметра в VacansyForm путем обращения к методу класса  GhostBustersMain который и передаем в качестве параметра!!!

                  String loginTxt = login.getText();
//пуьем обращения к к методу класса GhostBustersMain организуем вызов VacansyForm
                   parent.showVacansyForm();
               }
    });

  }

  public void getComponents(/*Container pn*/JPanel pn){
    JLabel l1 = new JLabel("Username:");
    JLabel l2 = new JLabel("Password:");

    JPanel main = BoxLayoutUtilits.createVerticalPanel();
    main.setBorder(BorderFactory.createEmptyBorder(12,12,12,12));

    JPanel name = BoxLayoutUtilits.createHorizontalPanel();
    //name.add(Box.createHorizontalStrut(12));
    name.add(l1);
    name.add(Box.createHorizontalStrut(12));
    name.add(login);

    JPanel pass = BoxLayoutUtilits.createHorizontalPanel();
    pass.add(l2);
    pass.add(Box.createHorizontalStrut(12));
    pass.add(password);

    JPanel flow = new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
    JPanel grid = new JPanel(new GridLayout(1,2,12,0));
    grid.add(btnLogin);
    grid.add(btnExit);
    flow.add(grid);

    BoxLayoutUtilits.setGroupAligmentX(new JComponent[]{name,pass,main,flow},Component.LEFT_ALIGNMENT);
    BoxLayoutUtilits.setGroupAligmentY(new JComponent[]{login,password,l1,l2},Component.CENTER_ALIGNMENT);
    GUITools.makeSameSize(new JComponent[]{l1,l2});
    GUITools.createReccommendedMargin(new JButton[] {btnLogin,btnExit });
    GUITools.fixTextFieldSize(login);
    GUITools.fixTextFieldSize(password);
    main.add(name);
    main.add(Box.createVerticalStrut(12));
    main.add(pass);
    main.add(Box.createVerticalStrut(17));
    main.add(flow);

    pn.add(main);
  }

}



А вот и сам Фрейм или класс как будет угодно VacansyForm
Код

package ghostbusters.ui.basedirector;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.Date;
import javax.swing.text.*;
import javax.swing.table.*;
import java.awt.geom.*;


public class VacansyForm extends JFrame  {
  JButton btn1 = new JButton("Печать");
 private JTextField vacansy_name = new JTextField(30);

   private JLabel vacansy_label = new JLabel("Код вакансии:");

  public VacansyForm() {
  }
  public void call(final GhostBustersMain parent) {
//хдесь мы просто опять же обращаясь к нашему клавному классу GhostBustersMain организуем вывод фрейма //ClientTableForm

    btn1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
              parent.showClientTableForm();
             }
    });

   
    getContentPane().add(pn);
    getComponents(pn,parent);
       
    etTitle("Новый соискатель");
    //setSize(800,800);
    pack();
    setVisible(true);
  }

  public void getComponents(JPanel pn){
  JPanel main = BoxLayoutUtilits.createVerticalPanel();
  main.setBorder(BorderFactory.createEmptyBorder(12,12,12,12));
   JPanel code = BoxLayoutUtilits.createHorizontalPanel();
   code.add(vacansy_label);
   code.add(Box.createHorizontalStrut(12));
   code.add(vacansy_code_label);
   code.add(btn1);

  main.add(code);
  main.add(Box.createVerticalStrut(12));
  pn.add(main);

}


   public void showStr(String str) {
   if (!str.equals("")) {
      phone_work.setText(str);
       //System.out.println("rowsNum =" + rowsNum );
  }
   }




На данном этапе вот что мы имеем:
Мы из Фрейма LoginForm вызвали VacansyForm, перелав ему в кач-ве параметра строку теперь вызываем ClientTableForm в нем введем данные и передадим их опять же в фрейм VacansyForm

ClientTableForm 
Код

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.Document;
import javax.swing.text.AbstractDocument;
import ghostbusters.exception.SystemException;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.Date;
import javax.swing.text.*;
import javax.swing.table.*;
import java.awt.geom.*;

public class ClientTableForm extends JFrame{
    JPanel pn = new JPanel();
    JTextField login = new JTextField(10);
    JPasswordField password = new JPasswordField(10);
    JButton btnLogin = new JButton("OK");
    JButton btnExit = new JButton("Exit");


 
  public void call(final GhostBustersMain parent)
  {
 //   parent.setContentPane(pn);
    this.getContentPane().add(pn);
    pn.setLayout(new BorderLayout());
    getComponents(pn);

    Document doc = login.getDocument();
    AbstractDocument absDoc = (AbstractDocument )doc;
    absDoc.setDocumentFilter(new DocumentSizeFilter (6));

    doc = password.getDocument();
    absDoc = (AbstractDocument )doc;
    absDoc.setDocumentFilter(new DocumentSizeFilter (6));

    //parent.pack();
    this.pack();
    this.setVisible(true);
    this.setTitle("Authorization");
    //parent.setVisible(true);

    btnLogin.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent evt){
 //Рередача параметра и вызов   VacansyForm      
           String loginTxt = login.getText();
            parent.showVacansyForm(loginTxt);

          dispose();
        
      }
    });

   
  }

  public void getComponents(/*Container pn*/JPanel pn){
    JLabel l1 = new JLabel("Username:");
    JLabel l2 = new JLabel("Password:");

    JPanel main = BoxLayoutUtilits.createVerticalPanel();
    main.setBorder(BorderFactory.createEmptyBorder(12,12,12,12));

    JPanel name = BoxLayoutUtilits.createHorizontalPanel();
    //name.add(Box.createHorizontalStrut(12));
    name.add(l1);
    name.add(Box.createHorizontalStrut(12));
    name.add(login);

    JPanel pass = BoxLayoutUtilits.createHorizontalPanel();
    pass.add(l2);
    pass.add(Box.createHorizontalStrut(12));
    pass.add(password);

    JPanel flow = new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
    JPanel grid = new JPanel(new GridLayout(1,2,12,0));
    grid.add(btnLogin);
    grid.add(btnExit);
    flow.add(grid);

    BoxLayoutUtilits.setGroupAligmentX(new JComponent[]{name,pass,main,flow},Component.LEFT_ALIGNMENT);
    BoxLayoutUtilits.setGroupAligmentY(new JComponent[]{login,password,l1,l2},Component.CENTER_ALIGNMENT);
    GUITools.makeSameSize(new JComponent[]{l1,l2});
    GUITools.createReccommendedMargin(new JButton[] {btnLogin,btnExit });
    GUITools.fixTextFieldSize(login);
    GUITools.fixTextFieldSize(password);
    main.add(name);
    main.add(Box.createVerticalStrut(12));
    main.add(pass);
    main.add(Box.createVerticalStrut(17));
    main.add(flow);

    pn.add(main);
  }

}





Собсна все хорошо, вот только если взгллянуть на эти методы, реализованные в классе GhostBustersMain (см выше), то можно заметить что при каждом обращении к ним, по-существу создается новый фрейм - этот критичный случай полностью показан когда мы уже построили Фрейм VacansyForm потом нажали кнопочку появился второй Фрейм - ClientTableForm - вели в последнем данные с целью передачи их в VacansyForm и нажали кнопочку а в обработке этой кнопке вот чего сидит у нас:
Код

 btnLogin.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent evt){
 //Рередача параметра и вызов   VacansyForm      
           String loginTxt = login.getText();
            parent.showVacansyForm(loginTxt);

          dispose();
        
      }
    });



А в методе showVacansyForm(String request) вот чего сидит

Код

// VacansyForm vacansyForm = new VacansyForm();
 public void showVacansyForm(String request) throws SystemException{
//создание еще одного экзмемпляра, ХОТЯ должен быть одын!!!
 VacansyForm vacansyForm = new VacansyForm();
     vacansyForm.call(this);
    vacansyForm.showStr(request);
}


То бишь у нас вылезет поверх исходного еще одын такой же фрейм!!!
Пробовал вот так

Код

VacansyForm vacansyForm = new VacansyForm();
  public void showVacansyForm(String request) throws SystemException{
     vacansyForm.call(this);
    vacansyForm.showStr(request);
}


Но тогда при вызове  vacansyForm.call(this) (см выше) слева добавляются элементы какие-то - может как-нбудь перед вызовом ФРЕМ перерисовывать или как поступить ????????????????????????

Жду ваших предложений, помогите уж пожалуйста. А за столь длинный топик просите-учусь ведь только! 

  

PM MAIL   Вверх
powerOn
Дата 5.12.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



насколько я понял, у тебя подход немного не тот. 
Для ввода данных в подобных ситуациях, обычно использую модель "диалога". Посмотри как реализована работа со стандартными диалоговыми окнами (JFileChooser, JOptionPane...) м сделай по аналогии свой диалог ввода.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
suomi
Дата 5.12.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот и с этим есть определенные сложности,powerOn. Скажем так, может ли один фрейм иметь два диалоговых окна. У меня процесс вызова происходит по схеме - Фрейм-Диалог1-Диалог2 , но при этом Диалог2 не закрывается, т.е. метод dispose() его не отрабатывается - думаю здесь как-то нужно указать, что Диалог2 закрывается, а не Диалог 1, но как ?
PM MAIL   Вверх
suomi
Дата 5.12.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



powerOn , спасибо за совет, вроде разобралси с передачей этих параметров через Диалоги. smile 
PM MAIL   Вверх
maxlab
Дата 6.12.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А стандартного паттерна для передачи параметров между InternalFrame не существует? Это я спрашиваю... а не утверждаю :-) Мне тоже пришлось реализовывать передачу параметров через диалоги. Работает... но коряво. Корявость заключается в том, что я планировал использовать один интернал фрейм с кучей конструкторов. Т.е каждый конструктор, в зависимости от того что мне надо, немного меняет поведение . В одном из таких режимов нужна модальность... А интернал фрейм таковым свойством не обладает. Пришлось делать диалог который один в один повторяет интернал фрейм. Думаю что не красиво. 
--------------------
Удивительное рядом... но оно запрещено!
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.1163 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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