Comunicação entre Frames

10 respostas
ItaloE

Olá…estou tentando fazer com que eu possa escrever uma mensagem em um frame e ao clicar em ‘enviar’ o label do segundo frame seja alterado, passando a exibir o que eu digitei no primeiro frame.
Dentre os varios problemas, como não conseguir fazer referencia ao segundo frame no metodo actionPerformed, eu sequer consigo referenciar um label do frame 2 dentro do frame 1, trocando seus valores…

no código abaixo tento referenciar o JLabel do frame2 em uma variavel do frame 1 e vice-versa…

public static void main(String[] args) {

Formulario f1 = new Formulario();

new Thread(f1).start();
Formulario2 f2 = new Formulario2(f1.getFrame());
	new Thread(f2).start();
	
	
	f1.setF(f2.getF());//referencia o frame do form 2 no form 1
	f2.setF(f1.getF());//refetencia o frame do form 1 no form 2
	
	f1.getLabel2().setText(f2.getLabel22().getText());
	f2.getLabel22().setText(f1.getLabel().getText());
	
}

o que acontece é que na linha “f1.getLabel2().setText(f2.getLabel22().getText());” eu pego uma NullPOinterException

alguém poderia me ajudar aqui ? não entendi o porque do null Exception…

se precisar do resto do código é só falar…

10 Respostas

D

Olá, para isto vc poderá usar Reflection:

http://www.guj.com.br/java.tutorial.artigo.10.1.guj

De uma olhada neste tutorial, e depois pesquise sobre o BeanUtils e PropertyUtils do apache. (commons-beanutils-1.6.jar), facilita muito a utilização com reflection.

Daniel Eduardo

dudaskank

Acho que não precisa de tanto não, é só dar uma organizada melhor no código que vai…

Aliás, olhando esse trecho aí já fiquei perdido hehehe.

Bom, o que vc vai precisar fazer é ver o que tá sendo retornado pelos seus getLabel(), porque a idéia é essa mesma. Provavelmente faltou fazer um label22 = new JLabel() hehehe.

Bem, se vc colocar a outra parte do código vai dar pra ver o que acontece aí melhor…

flw

ItaloE

Blz, dudaskank…

segue o codigo completo…

public class Teste {

/**
 * @param args
 */
public static void main(String[] args) {
	Formulario f1 = new Formulario();
	new Thread(f1).start();
	
	Formulario2 f2 = new Formulario2(f1.getFrame());
	new Thread(f2).start();
	
	
	f1.setF(f2.getF());//referencia o frame do form 2 no form 1
	f2.setF(f1.getF());//refetencia o frame do form 1 no form 2
	
	//troca o valor de um label do frame x pelo valor do label do frame y, somente para teste
	f1.getLabel2().setText(f2.getLabel22().getText());
	f2.getLabel22().setText(f1.getLabel().getText());
	
}

}

Agora os formularios…

public class Formulario implements ActionListener, Runnable {
private JLabel label;

private JLabel label2;

private JTextField textField;

private JPanel panel;

private JFrame frame;

private JFrame f;

private JButton button;

private JButton button2;

public JFrame getFrame() {
	return frame;
}

// construtor
public Formulario() {

}

public void montaForm() {

	label = new JLabel("seu nome: ");
	label2 = new JLabel("form 1");
	textField = new JTextField(30);
	button = new JButton("Exibir");
	button2 = new JButton("Enviar");

	button.addActionListener(this);

	panel = new JPanel();
	panel.add(label);
	panel.add(textField);
	panel.add(button);
	panel.add(button2);
	panel.add(label2);

	button2.setAlignmentX(100);
	button2.setAlignmentY(30);

	frame = new JFrame("Meu First Form, hahhaha!!!");
	frame.add(panel);

	frame.pack();
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public void actionPerformed(ActionEvent e) {
	String texto = textField.getText();
	JOptionPane.showMessageDialog(f, texto);

}


public void run() {
	this.montaForm();
}

public JFrame getF() {
	return f;
}

public void setF(JFrame f) {
	this.f = f;
}

public JLabel getLabel2() {
	return label2;
}

public void setLabel2(JLabel label2) {
	this.label2 = label2;
}

public JLabel getLabel() {
	return label;
}

}

Formulario 2:

public class Formulario2 implements ActionListener, Runnable {

// form 2

private JLabel label2;
private JLabel label22;

private JTextField textField2;

private JPanel panel2;

private JFrame frame2;

private JFrame f;

private JButton button2;

public JFrame getFrame() {
	return frame2;
}

// construtores
public Formulario2() {

}

public Formulario2(JFrame f) {

}

public void montaForm() {

	label2 = new JLabel("seu nome: ");
	label22 = new JLabel("form 2");
	textField2 = new JTextField(30);
	button2 = new JButton("Exibir");

	button2.addActionListener(this);

	panel2 = new JPanel();
	panel2.add(label2);
	panel2.add(textField2);
	panel2.add(button2);
	panel2.add(label22);

	frame2 = new JFrame("meu segundo frame,,heheheh!!!");
	frame2.add(panel2);

	frame2.pack();
	frame2.setVisible(true);
	frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public void actionPerformed(ActionEvent e) {
	String texto = textField2.getText();
	JOptionPane.showMessageDialog(f, texto);
}

public JFrame getF() {
	return f;
}

public void setF(JFrame f) {
	this.f = f;
}

public void run() {
	this.montaForm();

}

public JLabel getLabel2() {
	return label2;
}

public JLabel getLabel22() {
	return label22;
}

public void setLabel22(JLabel label22) {
	this.label22 = label22;
}

}

Já fiz diversas variações e de maneira nehuma consegui fazer um frame trocar um valor de um atributo de outro.

Vlw pela força…

aangreen

Passa o texto q vc quer imprimir no outro frame pelo construtor q funciona, ja usei dessa forma

ItaloE

entao, anngreen…

ate consegui fazer o que vc falou …mas não consegui pegar a ação do botao enviar do outro frame para fazer essa atribuição…
A idéia é fazer isto dinamicamente… se você souber uma forma de fazer assim pelo construtor eu agradeço :slight_smile: …tentei aqui e não tive sucesso(buscando um ActionEvent no construtor).

A idéia principal é passar as infos que são digitadas nos JTextFields para o outro frame…

Mas vlw pela dica!!!

aangreen

entaum cara, se vc quer passar só o q é digitado, poderia fazer pelo construtor mesmo…

mas se vc quiser passar um evento… ou que o frame dependa de um principal… aconselho a usar JInternalFrame

ItaloE

Vou tentar implementar aqui com essas duas aproximações então…

Vlw pelas dicas ae aangreen :smiley:

ct_d

Oi pessoal
Estou aqui com uma duvida
Estou a tentar saltar de uma janela (MainFrame- onde está o menu novo jogo) para a janela (ConfigDialog) onde a ConfigDialog vai buscar caracteristicas À função JogoEvolucionario
Inseri este codigo:

protected void novoJogoMenuItem_actionPerformed(ActionEvent e) {

ConfigDialog cd = new ConfigDialog();

cd.setVisible(true);

JogoEvolucionario conf = cd.getJogoEvolucionario();

if(conf != null){

//inicia jogo evolucionario no panel

}

O código funciona, mas não me mostra as labels, comboBox, etc k estao na janela ConfigDialog, apenas mostra essa janela vazia…

Como faço pa mostrar tudo o que está na janela?

cumprimentos

CrOnNoS

coloque o setVisible(true) apenas depois de terminar de mexer (configurar) tudo que você precisa mexer na sua janela.

ct_d

pus o setVisible(true) depois, e continua a não mostrar o conteudo que esta dentro da janela :S
posso ter feito mal :oops:

meti assim :

protected void novoJogoMenuItem_actionPerformed(ActionEvent e) {
		ConfigDialog cd = new ConfigDialog();
		
		JogoEvolucionario conf = cd.getJogoEvolucionario();
		if(conf != null){
			//inicia jogo evolucionario no panel
		}
		cd.setVisible(true);
		
	}

não é assim que é para fazer?

Criado 22 de setembro de 2006
Ultima resposta 15 de dez. de 2009
Respostas 10
Participantes 6