[resolvido] Gravar dados digitados em JTextField no banco

Pessoal, sou iniciante em Java e no Guj :smiley: e estou tentando fazer um sistema de agenda de contatos bem básica ir treinando … mas estou algumas dificuldades e gostaria da ajuda de vocês.

Bom, a conexão com o banco de dados JDBC (MySql) já está ok, o metodo adiciona() da DAO está funcionando certinho. Então implementei a classe TelaContato() com a parte gráfica, mas como faço para fazer a parte gráfica “conversar” com o banco??? Como faço para pegar o conteudo digitado nas JTextFields para jogar no banco?

Tentei fazer com uma ActionListener no botãoOk e usar o método getText() da JTextField, mas está dando vários erros quando clico no Ok da janela.

Segue abaixo minhas classes Contato, ContatoDAO e a Conexão com o Banco:

public class Contato {

	Long id;
	private String nome;
	private String telefone;
	private String email;
	private String endereco;
	
	
	//getters e setters
public class ContatoDAO {

	private Connection connection;
	
	public ContatoDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Contato contato) {
		
		String sql = "insert into contatos (nome, telefone, email, endereco) values (?,?,?,?)";
		
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getTelefone());
			stmt.setString(3, contato.getEmail());
			stmt.setString(4, contato.getEndereco());
			
			stmt.execute();
			stmt.close();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
public class ConnectionFactory {
	
	public Connection getConnection() {
	
		System.out.println("Conectando ao banco...");
		
		try {
			return DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "1234");
		} catch(SQLException e) {
			throw new RuntimeException(e);
				}
		}
	
}

Deixei comentado no codigo a parte que estou com dificuldades… isso que fiz está certo? É essa a idéia?

public class TelaContato {
	
	public static void main(String[] args) {
		new TelaContato().montaTela();
	}

	private JFrame janela;
	private JPanel painelPrincipal;
	private JPanel painelBotoes;
	private JPanel painelCampos;
	private JTextField campoNome;
              private JTextField campoTelefone;
	private JTextField campoEmail;
	private JTextField campoEndereco;
	
	private void montaTela() {
		// TODO Auto-generated method stub
		montaJanela();
		montaPainelPrincipal();
		montaPainelCampos();
		montaPainelBotoes();
		montaComponentesPainel();
		montaBotaoSair();
		montaBotaoOK();
		mostraJanela();
		
	}

	private void montaJanela() {
		janela = new JFrame("Agenda");
		janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	private void montaPainelPrincipal() {
		painelPrincipal = new JPanel();
		janela.add(painelPrincipal);
		painelPrincipal.setLayout(new BorderLayout());
	}
	
	private void montaPainelCampos() {
		painelCampos = new JPanel();
		painelPrincipal.add(painelCampos, BorderLayout.CENTER);
	}
	
	private void montaPainelBotoes() {
		painelBotoes = new JPanel(new GridLayout());
		painelPrincipal.add(painelBotoes, BorderLayout.SOUTH);
		
	}
	
	private void montaComponentesPainel() {
		
		JLabel labelNome = new JLabel("Nome");
		JTextField campoNome = new JTextField(20);
		painelCampos.add(labelNome);
		painelCampos.add(campoNome);
		
		JLabel labelTelefone = new JLabel("Telefone");
		JTextField campoTelefone = new JTextField(20);
		painelCampos.add(labelTelefone);
		painelCampos.add(campoTelefone);
		
		JLabel labelEmail = new JLabel("e-mail");
		JTextField campoEmail = new JTextField(20);
		painelCampos.add(labelEmail);
		painelCampos.add(campoEmail);
		
		JLabel labelEndereco = new JLabel("Endereço");
		JTextField campoEndereco = new JTextField(20);
		painelCampos.add(labelEndereco);
		painelCampos.add(campoEndereco);
		
		
		
	}
	
	private void montaBotaoOK() {
		JButton botaoOK = new JButton("OK");
		botaoOK.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				
/*		
                                                        Contato contato = new Contato();
				contato.setNome(campoNome.getText());
				contato.setEmail(campoEmail.getText());
				contato.setTelefone(campoTelefone.getText());
				contato.setEndereco(campoEndereco.getText());
				
				ContatoDAO contatoDAO = new ContatoDAO();
				contatoDAO.adiciona(contato);
*/
			}
		});
		painelBotoes.add(botaoOK);
	}

	private void montaBotaoSair() {
		JButton botaoSair = new JButton("Sair");
		botaoSair.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		painelBotoes.add(botaoSair);
	}
	
	private void mostraJanela() {
		janela.pack();
		janela.setSize(280, 380);
		janela.setVisible(true);
	}


}

Obrigado

É desse jeito mesmo.

Você esqueceu de dizer que erro está dando.

tudo isso! :shock:

Será que ta faltando alguma coisa naquelas PreparedStatement da classe DAO?? Ou é alguma exception que preciso tratar? to perdido :cry:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at br.com.agenda.view.TelaContato$1.actionPerformed(TelaContato.java:101)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Certo, e o você pode destacar o que tem na linha 101 do arquivo TelaContato.java, como seu erro indica?

Aliás, nem precisa, já vi seu erro.

Na linha 54 do código que você postou aqui no GUJ, você faz:

JTextField campoNome = new JTextField(20);  

Note que assim você está criando uma variável local, dentro do método montaComponentesPainel, que é diferente da variável declarada na linha 11.
A variável da linha 11, portanto, nunca é inicializada e, assim, seu valor permanece nulo. Por isso, ao tentar usa-la, você recebe um NullPointerException.

Troque a linha para:

this.campoNome = new JTextField(20);  

Ou, simplesmente:

campoNome = new JTextField(20);  

Se você estiver usando uma IDE, como o Eclipse, o nome da variável deve até mudar de cor, indicando que você está usando um atributo e não uma variável local.

Outra observação: Aprenda a usar o depurador e a ler as mensagens de erro. Seu erro poderia ser visto facilmente se você tivesse colocado um breakpoint na linha 101, como a mensagem de erro indica:
at br.com.agenda.view.TelaContato$1.actionPerformed(TelaContato.java:101)

Note que a mensagem diz:
O nome completo da classe onde o erro ocorreu:
at br.com.agenda.view.TelaContato$1 (uma classe interna da classe TelaContato, provavelmente o ActionListener)
O método onde o erro ocorreu:
actionPerformed
O arquivo e a linha do erro:
TelaContato.java:101

E você precisaria apenas procurar pelo que é nulo, como indica o tipo do erro:
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException

O depurador é capaz de mostrar o valor de cada variável na linha, e você pode acompanhar passo-a-passo a execução do seu código. É uma ferramenta extremamente poderosa, e fundamental na vida de qualquer desenvolvedor.

Obrigado pela ajuda! Entendi perfeitamente.

:lol:

Grato pela dica do depurador, vou procurar fazer melhor uso dele.

Abraço