Pegar valor do JTextField e transferir para outra classe

15 respostas Resolvido
Hundea

Estou tentando criar um crud…
PERGUNTA:
Como passar o valor da variável recebida pelo JTextField para a classe testeAgenda?

Tenho esse código onde fica dentro do pack view - nome do arquivo: CadastroUsuario.java (JFrame)

Código:

package View;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import Model.Contato.*;
import Model.ContatoDao;
import Model.TesteAgenda;

public class CadastroUsuario extends JFrame {

	//COMPONENTES
	JButton btnCadastrar = new JButton("CADASTRAR");
	JLabel lblNome = new JLabel("Nome:");
	
	**JTextField jtfNome = new JTextField();**

** public String varNome = jtfNome.getText();**

//MÉTODO CONSTRUTOR DA CLASSE
	public CadastroUsuario(){
		
		configCadUsuario();
		
		add(lblNome);
		add(jtfNome);
		add(btnCadastrar);
		lblNome.setBounds(5,10,110,20);
		jtfNome.setBounds(50,10,110,20);
		btnCadastrar.setBounds(10,50,110,20);

	btnCadastrar.addActionListener(new ActionListener(){
	     public void actionPerformed(ActionEvent e) {
	    	

	     }
	   });

	}
	
	public void configCadUsuario(){
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		setSize(300,200);
		setLayout(null);
		setVisible(true);	
	}
}

E também a classe que fica no pack Mode - nome do arquivo: testeAgenda.java

Código:

package Model;
import java.util.Date;

import Model.ContatoDao;
import Model.Contato;
import View.CadastroUsuario;
public class TesteAgenda {
	
    ContatoDao contatoDAO = new ContatoDao();

	public void inserir() {
	 //Cria um contato e salva no banco
	 Contato contato = new Contato();
	 contato.setNome(**varNome**);
	 contato.setIdade(21);
	 contato.setDataCadastro(new Date());
	 
	contatoDAO.save(contato);
	}
	public void atualizar() {
	 //Atualiza o contato com id = 1 com os dados do objeto contato1
	 Contato contato1 = new Contato();
	 contato1.setId(10);
	 contato1.setNome("NOME NOVO");
	 contato1.setIdade(32);
	 contato1.setDataCadastro(new Date());
	 
	 contatoDAO.update(contato1);
}
	 //Remove o contato com id = 1
	public void deletar() {
	 contatoDAO.removeById(2);
}
	 //Lista todos os contatos do banco de dados
	 public void mostrar() {
	 for(Contato c : contatoDAO.getContatos()){
	 
	 System.out.print("NOME: " + c.getNome());
	 System.out.println(" - "+"IDADE: " + c.getIdade());
	 }
	 }
}

15 Respostas

Jonathan_Medeiros

Tenta fazer da seguinte forma:

Contato contato = new Contato();

contato.setNome(seuTextField.getText());
/* Recupere todas as informações pro modelo de contato igual o exemplo da linha acima */

TesteAgenda teste = new TesteAgenda(); //Faça a instância da classe
teste.inserir(contato); //Chame o método inserir passando um contato como parâmetro

Deixe sua classe nesse formato:

public class TesteAgenda {
	
    ContatoDao contatoDAO = new ContatoDao();

	public void inserir(Contato contato) {
	    //Cria um contato e salva no banco
	    contatoDAO.save(contato);
	}

    /* Demais métodos e implementações */
}
witalok2

Que tipo de dados esta tentando passar ? vai cadastrar no banco e quer recuperar ?

Hundea

Só quero cadastrar no momento.

Hundea

Problema:image

staroski

Faz favor de formatar seus códigos com o botão </>, muito ruim ler assim.

Veja o que você fez:

TesteAgenda agenda = new TesteAgenda();
agenda.inserir();  // inserir o quê?

Agora compare com o exemplo que o @Jonathan_Medeiros postou.

Hundea

Coloquei com </> mas as vezes bug na disposição do código.

Hundea

Fiz assim:

public class TesteAgenda {
    ContatoDao contatoDAO = new ContatoDao();

	public void inserir(String setNomxe) {
	 //Cria um contato e salva no banco
	 Contato contato = new Contato();	 
	 contato.setNome(setNomxe);
	 contato.setIdade(21);
	 contato.setDataCadastro(new Date());
	contatoDAO.save(contato);
	}

passei via parâmetro como pode observar:public void inserir(String setNomxe)

O botão ficou assim:

btnCadastrar.addActionListener(new ActionListener(){
	     public void actionPerformed(ActionEvent e) {
	    	 TesteAgenda as = new TesteAgenda();
	    	 as.inserir(jtfNome.getText());
	     }
	   });

Ficou tudo certo, funcionou, mas necessariamente eu preciso sempre passar como parâmetro dessa forma? ou tem outra forma que eu acesso o conteúdo diretamente, sem passar via parâmetro?

Como por exemplo no JButton:

as.inserir(contato.setText(jtfNome.getText());

Jonathan_Medeiros

Passa o objeto de contato completo como no exemplo que te passei!

Ao invés de informar diversos parâmetros no método inserir, você passa o objeto como um todo, dessa forma você diminui a complexidade de código e fica bem mais legível.

Hundea

No caso vou apenas passando aqui no parâmetro né? saquei. Obrigado…
as.inserir(jtfNome.getText(),jtfIdade.getText()); e quantos mais outros houver em meu método…

Jonathan_Medeiros

Você monta o objeto de contato lá no seu jFrame de cadastro, e passa esse objeto pronto para a sua classe que vai salvá-lo.

Contato contato = new Contato();
contato.setNome(seuCampoDeNome.getText());
contato.setIdade(Integer.parseInt(seuCampoDeIdade.getText()));
contato.setDataCadastro(new Date());

TesteAgenda teste = new TesteAgenda();
teste.inserir(contato); //Aqui vai o objeto completo muito mais limpo do que informar todos os dados como parâmetros únicos
Hundea

Desse jeito que diz não consigo… veja:
public class TesteAgenda {

ContatoDao contatoDAO = new ContatoDao();
   
	public void inserir() {
	 //Cria um contato e salva no banco
	 Contato contato = new Contato();	 
	 contato.setNome(jtfNome.getText());
	 contato.setIdade(Integer.parseIn(tfNome.getText()));
	 contato.setDataCadastro(new Date());
	 
	contatoDAO.save(contato);
	}

btnCadastrar.addActionListener(new ActionListener(){
	     public void actionPerformed(ActionEvent e) {
	    	 TesteAgenda as = new TesteAgenda();
	    	 as.inserir(contato);
	    
	     }
	   });

	}

image

Jonathan_Medeiros
Solucao aceita

Isso aqui fica lá na sua classe que representa seu jFrame, os jTextFields não existem na classe TestAgenda, por isso acusa o erro, você está fazendo o contrário do que eu sugeri!

Observe o exemplo que passei, o método inserir recebe um parâmetro do tipo contato!

public void inserir(Contato contato) {	 
	contatoDAO.save(contato);
}
Hundea

Fiz, deu certinho, obrigado chefe.

Hundea

Na minha opinião, em tese é mais adequado o primeiro modo em padrão MVC, e na sua?
Digo que a primeira é mais adequado visto que o view é mais focado para GUI e já transferindo esses códigos para outra camada do padrão, ex: model já facilita mais a visualização do código.

Jonathan_Medeiros

Não entendi a sua pergunta, se puder contextualize ela!

Criado 28 de junho de 2019
Ultima resposta 28 de jun. de 2019
Respostas 15
Participantes 4