Народ, вот у меня проблема с передачей данных между фреймами. Есть Фрейм 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) (см выше) слева добавляются элементы какие-то - может как-нбудь перед вызовом ФРЕМ перерисовывать или как поступить ????????????????????????
Жду ваших предложений, помогите уж пожалуйста. А за столь длинный топик просите-учусь ведь только!