Dúvida na captura de informação do JTextField

7 respostas
MadeInJava

Boa noite! pessoal

Estou com uma dúvida na captura de informações do JTextField, estou trabalhando com padrão MVC só que a minha classe PessoaDAO que se encontra na camada de modelo precisa capturar as informações inseridas nos campos, com isso tudo a única forma aonde consegui capturar as informações foi ter deixado os JTextField como public e static para que eu consiga ter acesso as informações na classe PessoaDAO, só que é seguinte gostaria de saber de vocês se eu estou implementando este caso de forma correta e se existe uma forma apropriada de implementação para esse tipo de caso. Porem com tudo isso acho que estou quebrando a regra do padrão MVC, porque a minha classe PersonDAO está tendo acesso aos atributos do tipo JTextField que pertencem a classe FrameCadastro.

Segue abaixo o código que foi implementado:

package br.edu.unip.view;

import java.awt.Container;
import java.awt.GridLayout;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;

import br.edu.unip.controller.ListenerFrameCadastro;

@SuppressWarnings("serial")
public class FrameCadastro extends JFrame {

	private Container contentPane;
	private JLabel lblNome;
	private JLabel lblNascimento;
	public static JTextField txtNome;
	public static JFormattedTextField txtNascimento;
	private JButton btnSalvar;

	public FrameCadastro() {
		super("Cadastro");
		contentPane = getContentPane();
		this.defineLayout(contentPane);
		this.setSize(200, 160);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	private void defineLayout(Container c) {
		c.setLayout(new GridLayout(6, 1));
		lblNome = new JLabel("Nome:");
		c.add(lblNome);
		txtNome = new JTextField();
		c.add(txtNome);
		lblNascimento = new JLabel("Nascimento:");
		c.add(lblNascimento);
		MaskFormatter mask = null;
		try {
			mask = new MaskFormatter("##/##/####");
			mask.setPlaceholderCharacter('_');
			txtNascimento = new JFormattedTextField(mask);
		} catch (ParseException e) {
			JOptionPane.showMessageDialog(
					null,
					"Não foi possível converter a data de nascimento: "
							+ e.getMessage());
		}
		c.add(txtNascimento);
		btnSalvar = new JButton("Salvar");
		btnSalvar.addActionListener(new ListenerFrameCadastro());
		c.add(btnSalvar);
	}

	public static void main(String[] args) {
		new FrameCadastro();
	}
}
package br.edu.unip.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import br.edu.unip.view.FrameCadastro;

public class PessoaDAO {

	public static void insert() {
		Connection conexao = FabricaDeConexao.getConexao();
		String sql = "insert into pessoa(nome, nascimento) values (?, ?)";
		Pessoa pessoa = new Pessoa();
		pessoa.setNome(FrameCadastro.txtNome.getText());
		pessoa.setNascimento(FrameCadastro.txtNascimento.getText());
		try {
			PreparedStatement ps = conexao.prepareStatement(sql);
			ps.setString(1, pessoa.getNome());
			ps.setString(2, pessoa.getNascimento());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}
}

7 Respostas

Henrique_Moraes

Olá amigo, desse jeito vai funcionar sim… Mas o correto seria você declarar sua variável txtNome e txtNascimento, como private, e adicionando os métodos getters e setters de ambas, ficando dessa forma:

//declarando variaveis privadas
    private JTextField txtNome;  
    private JFormattedTextField txtNascimento;  

    //criando métodos getters
    public String getNome(){
       return txtNome.getText();
    }

    public String getNascimenato(){
       return txtNascimento.getText();
    }

    //criando metodos setters
    public void setNome(String nome){
       txtNome.setText(nome);
    }

    public void setNascimento(String nascimento){
       txtNascimento.setText(nascimento);
    }

Quando você quiser retornar o que contém em nome e/ou nascimento você vai usar os metodos getters, e para setar as variáveis os metódos setters.

Entendeu?

MadeInJava

Valeu! cara achei bacana sua proposta só que o problema agora é o seguinte pra mim poder ter acesso a esses métodos getters e setters, vou ter que criar uma instância de FrameCadastro na classe PessoaDAO que é uma camada de modelo… eu implementei como você me falou só que o problema agora é que quando clico no botão salvar ele abre várias janelas e preenche os campos deixando como null no banco de dados.

package br.edu.unip.view;

import java.awt.Container;
import java.awt.GridLayout;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;

import br.edu.unip.controller.ListenerFrameCadastro;

@SuppressWarnings("serial")
public class FrameCadastro extends JFrame {

	private Container contentPane;
	private JLabel lblNome;
	private JLabel lblNascimento;
	private JTextField txtNome;
	private JFormattedTextField txtNascimento;
	private JButton btnSalvar;

	public FrameCadastro() {
		super("Cadastro");
		contentPane = getContentPane();
		this.defineLayout(contentPane);
		this.setSize(200, 160);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	
	public String getNome() {
		return txtNome.getText();
	}
	
	public String getNascimento() {
		return txtNascimento.getText();
	}

	private void defineLayout(Container c) {
		c.setLayout(new GridLayout(6, 1));
		lblNome = new JLabel("Nome:");
		c.add(lblNome);
		txtNome = new JTextField();
		c.add(txtNome);
		lblNascimento = new JLabel("Nascimento:");
		c.add(lblNascimento);
		MaskFormatter mask = null;
		try {
			mask = new MaskFormatter("##/##/####");
			mask.setPlaceholderCharacter('_');
			txtNascimento = new JFormattedTextField(mask);
		} catch (ParseException e) {
			JOptionPane.showMessageDialog(
					null,
					"Não foi possível converter a data de nascimento: "
							+ e.getMessage());
		}
		c.add(txtNascimento);
		btnSalvar = new JButton("Salvar");
		btnSalvar.addActionListener(new ListenerFrameCadastro());
		c.add(btnSalvar);
	}

	public static void main(String[] args) {
		new FrameCadastro();
	}
}
package br.edu.unip.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import br.edu.unip.view.FrameCadastro;

public class PessoaDAO {

	public static void insert() {
		Connection conexao = FabricaDeConexao.getConexao();
		String sql = "insert into pessoa(nome, nascimento) values (?, ?)";
		Pessoa pessoa = new Pessoa();
		pessoa.setNome(new FrameCadastro().getNome());
		pessoa.setNascimento(new FrameCadastro().getNascimento());
		try {
			PreparedStatement ps = conexao.prepareStatement(sql);
			ps.setString(1, pessoa.getNome());
			ps.setString(2, pessoa.getNascimento());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}
}
MadeInJava

Testei novamente aqui só que agora eu deixei os getters e os JTextField como static ai funcionou normalmente salvo tudo certinho no banco de dados. Mas será que está correto deixar como static?

Henrique_Moraes

Entendi… tente colocar os metodos getters e setter como static

Henrique_Moraes

Ok amigo… depois dê uma olhada aqui http://mballem.wordpress.com/2011/01/26/static-x-instance/

vlw

asandrob

Mestre, vc tem que fazer ± assim:

  1. Vc constroi a View bonitinha com tudo que ela tem direito;
  2. Em algum lugar da tua View vai ter um botão para gravar, certo?
  3. No botão de gravar, vc vai adicionar um listener para “ouvir” os eventos de clic;
  4. Nesse evento “clic”, é nele que vc vai instanciar um objeto do tipo PessoaDAO, dai vc tem acesso a todos os atributos da view, lembrando que vc está dentro da View;
  5. No PessoaDAO recem criado vc lê todos os atributos e manda ele executar as tarefas desejadas.

Acho que é ± assim…

O
Olá, Bom dia. O que vc pode e deve fazer é adicionar mais uma camada. Da seguinte forma:
//primeiro, na classe ou na mesma classe do textField vc pode criar um objeto, uma string ou se houver um objeto pessoa, melhor, vc cria ele, com getters e setters.
	private String dataDeNascimento;
	private PessoaTO pessoaTO;
	public String getDataDeNascimento() {
		return dataDeNascimento;
	}

	public void setDataDeNascimento(String dataDeNascimento) {
		this.dataDeNascimento = dataDeNascimento;
	}

	public PessoaTO getPessoaTO() {
		return pessoaTO;
	}

	public void setPessoaTO(PessoaTO pessoaTO) {
		this.pessoaTO = pessoaTO;
	}
//no botao salvar, no actionListener, vc seta o valor seja da string seja da Pessoa- depende de com o que vc estiver trabalhando.
public void adicionaListenerBotoes(){
       getBtnSalvar().addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
//se estiver trabalhando com string e não com um objeto
				setDataDeNascimento(getTextField().getText());
// se estiver trabalhando com um objeto, vc popula ele aqui. Populei apenas um dado... Considerei que a variavel pessoaTO foi usada para popular a tela.
                           getPessoaTO().setDataNascimento(getTextField().getText());
//aqui vc chama a classe da camada intermediária que aparece logo abaixo, num método que passe como parâmetro o valor populado. Como prefiro trabalhar com objetos, entao estou enviando a pessoaTO para ele.
getClasseIntermediaria().alterarPessoa(getPessoaTO)
				
			}
		});
}
public FacadePessoa getClasseIntermediaria()
{
return new FacadePessoa();
}
//a classe intermediária
public class FacadePessoa(){
//primeiro, ela deve ter o PessoaDAO
private PessoaDAO pessoaDAO;
//cria o getter dela e depois o método que criamos na classe anterior
public PessoaDAO getPessoaDAO()
{
return pessoaDAO;
}
public void alterarPessoa(PessoaTO pessoa)
{
//aqui vc chama o método da sua DAO que vc quer passando como parâmetro a variavel recebida. 
getPessoaDAO().alterarPessoa(pessoa);
}
}
Dessa forma, vc mantém as camadas separadas, sem que sua view acesse diretamente o DAO, e sem que o DAO tenha que mexer ou lidar com a view. Caberia ainda mais camadas entre DAO e View, como por exemplo, a camada de Serviço(Service)- não sei se esse é o melhor nome- aonde ficariam as regras de negócio. Só uma observação: não seria melhor se dentro do frame vc tivesse um Jpanel aonde vc colocasse os botões e textfields e todos os demais componentes gráficos? espero ter te ajudado.
Criado 13 de novembro de 2012
Ultima resposta 14 de nov. de 2012
Respostas 7
Participantes 4