Duvida entre passar parametros entre 2 JFrame

18 respostas
cardosodario

Amigos, tenho a seguinte situação:

1 JFrame Pai que possui entre outros componentes o campo Codigo JTextField

Fiz um JFrame Filho com o nome ABCJFrame

Ao apertar um botão eu inicio ele e apresento na tela conforme mostra o codigo abaixo

ABCJFrame formABCJFrame;
    formABCJFrame=new ABCJFrame();
    formABCJFrame.setTitle("Teste");
    formABCJFrame.setVisible(true);

Neste ponto eu gostaria que quando aparece-se o JFrame filho eu pudesse ao apertar um determinado botao, atualizar o campo Codigo do JFrame Pai. tipo CodigodoJFramePai.setText(“1”)

Como este JFrame filho não esta em Modal ele seta como visivel e já retorna no codigo anterior então eu teria que conseguir atualizar pelo botão passando este codigo por referencia ou outra alternativa que não sei fazer.

Alguém pode me ajudar?

Dario

18 Respostas

alucardeck

assim?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Pai {

	public static void main(String[] args) {
		new Pai();
	}
	
	JTextField txt;
	
	public Pai(){
		JFrame pai = new JFrame();
		txt = new JTextField("oi",10);
		pai.add(txt);
		pai.pack();
		pai.setVisible(true);
		pai.setDefaultCloseOperation(pai.EXIT_ON_CLOSE);
		
		JFrame filho = new JFrame();
		JButton btn = new JButton("Clica!");
		btn.addActionListener(
			new ActionListener(){
				public void actionPerformed(ActionEvent event){
					txt.setText("hahah!");
				}
			}		
		);
		filho.add(btn);
		filho.setLocation(120, 0);
		filho.pack();
		filho.setVisible(true);
		
	
		
	}
}
cardosodario

Seria mais ou menos isto, mas no meu caso não estou no main e sim tenho 2 arquivos de JFrame, 1 Pai e outro Filho

Cada um é uma classe distinta, então na classe filho eu não enxergo o campo txt da classe pai, como fazer pra eu enxergar este campo txt da classe pai nesta classe filho?

Dario

L

não testei aqui, mas vc já experimentou criar um método setCódigo no frame pai, depois chamar esse método no frame filho tipo…

super.setCodigo("10");

e adiciona dentro do método setCodigo(String s) um repaint() para atualizar os valores…

cardosodario

vou testar,

você diz que na classe filho a palavra super herda os dados da pai?

como eu faria pra ter acesso a todos os objetos da classe pai?

dario

cardosodario

Não consegui fazer, criei um pequeno exemplo no netbeans e to colocando ele em anexo, se alguém puder altera-lo para fazer rodar agradeço,

Dario

L

tipo assim…

Na classe Pai…

JTextField txfDadosPai = new JTextField();
// Outras instruções...

public void setTextoDadosPai(String s){
    txfDadosPai.setText(s);
repaint();//Não creio que este comando é necessário,... teste com e depois sem para ver os efeitos
}

e na classe Filho… na ação do botão, ou seja no ActionListener do botão você coloca algo tipo assim…

super.setTextoDadosPai("Texto que voce quer que apareça no frame Pai");

o comando super consegue acessar os métodos da classe pai… Mesmo sem o super você também consegue acessar,contanto que não tenha sobrescrito o método na classe atual…mas tenta fazer algo parecido no seu código pra ver no que dá

cardosodario

Eu tentei mas o netbeans acusa que não consegue achar esta variavel, no exemplo em anexo que postei tem o que eu quero fazer mas eu não consigo implementar o super para setar o codigo do frame pai…

L

Na sua classe filho vc deve extender da classe pai e não de outro jframe…por isso vc não está conseguindo acessar a classe pai…

assim…

public class Filho extends Pai{
//.. códigos anteriores
  private void initComponents() {

//..//
     super.setTextoDadosPai("Texto que voce quer que apareça no frame Pai");  

//..// 
}


}
cardosodario

fiz o teste mas agora quando ele abre o filho ele apresenta todos os objetos do pai na tela do filho.

como proceder para que isto não ocorra?

Dario

A

Estiou com o mesmo problema - tenho um JFrame que tem uma referência para outro. Esse outro JFrame deve ser único, então eu, além de colocar setAlwaysOnTop(true) eu uso um this.setEnabled(false) para não ser possível clicar em um botão da janela anterior.
Porém, quando eu dou um Cancelar ou fecho a janela, não consigo voltar para a anterior (na verdade, volta, mas não consigo mexer (nem fechar no “x” nem arrastar a janela).
Além disso, depois de ele digitar as informações, eu também gostaria de atualizar alguns campos no Frame pai.

Estamos pensando em usar Singleton para não abrir mais de 1 mesma interface, porém não consigo enviar os dados para o Frame pai.

Alguém sabe como fazer isso.

Abraço.

cardosodario

Em outra linguagem Visual que eu uso também, é possivel criar uma chamada para um formulario filho, sendo esta chamada em Modal ai quando a janela filho é apresentada ela trava as outras e apenas quando fecha-se a filho as outras são liberadas e o formulario pai continua em execução.
Gostaria de aprender a fazer isto em JAVA.

Veja o meu exemplo em Visual dBase

Janela Pai sendo executada ao apertar um botão chama-se a filho

set procedure to Filho.wfm additive // chama para a memoria o formulario filho

f=new FilhoForm() // inicia o formulario filho

f.readModal() // nesta instante as outras janelas ficam travadas e é apresentado a janela filho em Modal, quando fecha-se a filho o programa continuar após esta linha podendo até obter retorno da janela filho

if f.ApertouCancelar // se apertou cancelar faz A

if f.ApertouConfirmar // se apertou confirmar faz B

Alguém poderia explicar como implementar isto em JAVA??/

Dario

A

Estou com a dúvida ainda. Não consegui achar alguma coisa legal que pudesse resolver o problema de forma eficiente.

marciogm

Passa o jframe Pai para o construtor do Filho.

Filho f = new Filho(Pai.this);

assim fica…

pai.getJTextfield().setText("1");
A

[quote=marciogm]Passa o jframe Pai para o construtor do Filho.

Filho f = new Filho(Pai.this);

assim fica…

pai.getJTextfield().setText("1");

Oi.
Também estava com a dúvida.
Essa solução parece interessante (apesar de eu não ter testado, acredito que funcionará). Eu teria que colocar uma referência para a classe Pai no Filho, né? Ficaria tipo:
Pai -> Filho
Filho -> Pai

O problema, nesse caso, não é que ficaria muito acoplado?

Abraço.

aix

porque vc não transforma a classe filho numa classe interna da classe pai ?
porque se você quiser que essa classe separada (filho) se comporte como se fizesse parte dessa classe(pai) ás vezes usar classes internas é a melhor saida.

Andre_Brito

aix:
porque vc não transforma a classe filho numa classe interna da classe pai ?
porque se você quiser que essa classe separada (filho) se comporte como se fizesse parte dessa classe(pai) ás vezes usar classes internas é a melhor saida.

Isso foi até cogitado. Porém, temos muitas referências nas interfaces. Além disso, cada interface filha provavelmente terá mais referências para outras classes. Acredito que isso ficaria muito complexo (principalmente de ler e dar manutenção). Ainda, a interface filha é reutilizada em diversos pontos da interface, sabe como?

Acho que seria mais barato acoplar do que fazer as classes internas (nossa, não acredito que eu falei isso).

Abraço.

cardosodario

Tentei fazer a implementação, criei no netbeans um JFrame chamado Pai e outro chamado Filho

No Pai num botão coloquei a chamada abaixo

Filho f;
    f = new Filho(Pai.this);
    f.setVisible(true);

na segunda linha ele aponta este erro:

cannot find symbol
symbol : constructor Filho(Principal.Pai)
location : class Principal.Filho

como resolver?

Dario

Andre_Brito

Você tem que criar um construtor que receba o parâmetro.
Vai lá na classe Filho e cria um construtor assim

public Filho(javax.swing.JFrame pai)
{
}

Abraço.

Criado 12 de junho de 2008
Ultima resposta 6 de nov. de 2008
Respostas 18
Participantes 7