estou tentando passar data que recebo em string do meu JFormatedText em java.sql.Date para persistir no banco de dados… como quero realmente dominar o core do java, antes de partir para frameworks. estou tendo problemas com o parse… criei um metodo no meu model Cliente, para fazer o parse, mas recebo a seguinte stack trace.
Conectando ao Banco
java.text.ParseException: Unparseable date: “24/07/1993”
at java.text.DateFormat.parse(DateFormat.java:337)
at com.model.Cliente.parseData(Cliente.java:66)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:28)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at com.model.Cliente.parseData(Cliente.java:70)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:28)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
á seguir o codigo com o metodo
package com.model;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Cliente {
private String nome;
private int sexo;
private String telefone;
private String rg;
private String cpf;
private String dataNascimento;
public Cliente(String nome, int sexo, String telefone, String rg, String cpf, String dataNascimento) {
this.nome = nome;
this.sexo = sexo;
this.telefone = telefone;
this.rg = rg;
this.cpf = cpf;
this.dataNascimento = dataNascimento;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getSexo() {
return sexo;
}
public void setSexo(int sexo) {
this.sexo = sexo;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
public String getRg() {
return rg;
}
public void setRg(String rg) {
this.rg = rg;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(String dataNascimento) {
this.dataNascimento = dataNascimento;
}
public Date parseData(String data){
SimpleDateFormat formataData = new SimpleDateFormat("yyyy-MM-dd");
Date novaData = null;
try {
novaData = (Date) formataData.parse(data);
} catch (ParseException e) {
e.printStackTrace();
}
return new Date(novaData.getTime());
}
}
O formato que está sendo passado é diferente do pattern especificado no SimpleDateFormat. Se vai passar a data “24/07/1993”, o pattern deve ser “dd/MM/yyyy” ao invés de “yyyy-MM-dd”.
SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");
hum… nao havia me atentado ha isso… agora porem… estou recebendo esta stacktrace, acho que o problema esta no meu DAO… sou iniciante em desktop entao. devem haver alguns erros.
Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at com.model.Cliente.parseData(Cliente.java:66)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:28)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
ah… a stacktrace agora é essa… acho que o problema é que o metodo parse da simpledateformat retorna um java.util.date e nao um java.sql.date. ainda nao achei solução. nem o cast funcionou…
Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at com.model.Cliente.parseData(Cliente.java:66)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:29)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
O problema não está no DAO e sim no Cliente. Na classe Cliente você está importando java.sql.Date, portanto se não especificar o caminho do Date, será usado o do pacote java.sql. Se olhar o stack trace verá que a exceção é lançada no método parseData na linha 66:
at com.model.Cliente.parseData(Cliente.java:66)O problema com o cast está aqui:
novaData = (Date) formataData.parse(data); // novaData é um java.sql.Date e o parse retorna um java.util.Date
Porque não armazena a data como Calendar? Quando for passar para o DAO, faz o procedimento sugerido pelo Rogerio, convertendo pra java.sql.Date.
sim. essa era minha ideia inicial. mas mudei por que nao consegui passar. pegar do JFormatedText pra popular o cliente. nao achei um metodo para calendar.
private void montaBotaoAdicionar() {
JButton botaoCarregar = new JButton("Adicionar");
botaoCarregar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new ClienteDAO().adiciona(new Cliente(nome.getText(), sexo.getSelectedIndex(), telefone.getText(), rg.getText(), cpf.getText(), dataNascimento.getText());
}
});
principal.add(botaoCarregar);
}
pronto… ja esta quase tudo resolvido. so nao estou conseguindo pegar o valor da data de nascimento quando populo o cliente, pegando os valores jformatedtextfield que contem o calendario…
private void montaBotaoAdicionar() {
JButton botaoCarregar = new JButton("Adicionar");
botaoCarregar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new ClienteDAO().adiciona(new Cliente(nome.getText(), sexo.getSelectedIndex(), telefone.getText(), rg.getText(), cpf.getText(), dataNascimento.getText());
}
});
principal.add(botaoCarregar);
}
aonde eu pego o getText(); da dataNascimento. ele nao aceita. nao to conseguindo pegar o valor dele por ser date, ja testei com o getValue() e tambem nao funcionou.
Você mudou a dataNascimento para Calendar? Se for isso tem que passar como Calendar e não como String.
Você pode usar o método de parse que postou no primeiro post. Eu só tinha dito que não é responsabilidade do cliente fazer o parse da data, que deve ser feito antes de passar a data para o cliente.
sim, mas na hora de popular, o getText(); nao funciona, por que dataNascimento é Calendar, eu estou implementando outro parse aqui, mas nao estou sabendo como chamalo.
Obrigado Eric Yuzo. agora deu certo… não sabia que swing dava tanto trabalho. acho que existem frameworks que facilitam bem o trabalho, mas acho que é melhor começar na unha mesmo… como vou desenvolver o sistema completo mesmo. provavelmente terei mais diversas duvidas… vlw.