Jtable - mouseClicked() leva data invertida para o campo no padrão "yyy/MM/dd"

5 respostas
F

Olá pessoal

Tenho um jinternalFrame onde tenho um campo data do tipo date ( no java e no banco) e salvo no banco de dados ( SQL Server 2008 ). Quando clico no botão todos, aparece na jtable todas as datas que estão no banco já formatadas conforme: ( dd/MM/yyyy ).

Uso o método mouseClicked() onde ao clicar em alguma linha da jtable que consta uma data, aparece no campo data a respectiva data selecionada na jtable.

No entanto, estou com problema pois algumas datas aparecem invertidas pois se na jtable está 01/07/2011 ao clicar sobre ela, ela aparece no campo como 07/01/2011.
Obs: o campo Data não é jTextField ou jFormattedTextField, é um JDataChooser ( um componente adicionado à paleta do NetBeans do JCalendar )
Segue codificação:

No SQL Server:

create table data 
(
     data date
)

No java:

private Date data;

...construtor...
...sets e gets...

Classe DAO:

public class PessoaFisicaDAO {
  SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");

Inclui a data no banco:

public boolean IncluirPessoaFisica(Teste objPessoa) throws SQLException{
    
    Conexao conexao = new Conexao();
    PreparedStatement pstmt = conexao.getConexao().prepareStatement("Insert into data (data) values (?)");

   pstmt.setTimestamp(1, new java.sql.Timestamp(objPessoa.getData().getTime()));
   int registros = pstmt.executeUpdate();   

    if(registros < 1){
        return true;
    }
    else
        return false;
    }

Traz os dados do banco para a jtable

public Vector PesquisarPessoaFisicaTodos() throws SQLException
    {
        Conexao conexao = new Conexao();
        Vector linhas = new Vector();
        PreparedStatement pstmt = conexao.getConexao().prepareStatement("SELECT data from data  ");        

        ResultSet rs = pstmt.executeQuery();

            while(rs.next())
            {
                Teste objPessoa = new Teste();
                objPessoa.setData(rs.getDate("data"));

                Vector novalinha = new Vector();
                novalinha.addElement(formataData.format(objPessoa.getData()));
                //novalinha.addElement((objPessoa.getData()));                            // percebi que ao habilitar essa linha ( e desabilitar a linha de cima ) resolve ao trazer a data da table para o campo mas na table fica sem formatação, no estilo "yyyy/MM/dd"	
                linhas.addElement(novalinha);
            }
        return linhas;
}

e por fim, o método que leva a data ( que está na linha selecionada da jtable ) para o campo “Data”

private void jtabletesteMouseClicked(java.awt.event.MouseEvent evt) {                                         
         try {        

        java.util.Date data_banco3 = new java.util.Date((jtableteste.getModel().getValueAt(jtableteste.getSelectedRow(), 0).toString().replace("-","/")));
       
        Preenchendo o campo data:

        Data.setDate((data_banco3));
      
        }
        catch(Exception erro) {
            System.out.println("erro ao converter a data do banco: " + erro.getMessage());
        }

    }

Obrigado a todos

5 Respostas

Eric_Yuzo

fernandom:
No entanto, estou com problema pois algumas datas aparecem invertidas pois se na jtable está 01/07/2011 ao clicar sobre ela, ela aparece no campo como 07/01/2011.
Obs: o campo Data não é jTextField ou jFormattedTextField, é um JDataChooser ( um componente adicionado à paleta do NetBeans do JCalendar )

Aparentemente é o pattern do JDateChooser que está diferente do TableModel. Se for isto mesmo, basta especificar o padrão por um dos construtores ou pelo método “setDateFormatString”

dateChooser.setDateFormatString("dd/MM/yyyy");
F

Já alterei no mouseClicked() mas ainda ficam trocadas e aumentadas …

private void jtabletesteMouseClicked(java.awt.event.MouseEvent evt) {                                         
         try {        
        java.util.Date data_banco3 = new java.util.Date((jtableteste.getModel().getValueAt(jtableteste.getSelectedRow(), 0).toString().replace("-","/")));
        
        Data.setDateFormatString("dd/MM/yyyy");        
        Data.setDate(data_banco3);

        }
        catch(Exception erro) {
            System.out.println("erro ao converter a data do banco: " + erro.getMessage());
        }

    }

Alguém pode ajudar ?

Eric_Yuzo

O setDateFormatString deve ser executado na inicialização da classe e não no evento do mouse. Mas de qualquer forma não é este o problema. O problema está neste trecho:

java.util.Date data_banco3 = new java.util.Date((jtableteste.getModel().getValueAt(jtableteste.getSelectedRow(), 0).toString().replace("-","/")));

Este construtor aí da classe Date nem deveria mais ser usado, e ele não está usando o padrão “dd/MM/yyyy” para gerar o objeto Date. Prefira usar o método parse do seu DateFormat, que vai fazer o parse de acordo com o padrão que você especificou.

Mas o mais correto ainda é recuperar o objeto “Pessoa” diretamente do seu TableModel ao invés de pegar o valor com getValueAt. Assim não é necessário fazer essas conversões todas para passar valores de um componente a outro.

F

Achei bacana a sua ideia de pegar o objeto data pelo table… mas pelo jtable tem como ?

Com relação às suas dicas, tentei da seguinte forma:

Data.setDate((Date) jtableteste.getModel().getValueAt(jtableteste.getSelectedRow(), 0));

Porém surgiu a seguinte mensagem:

erro ao converter a data do banco: java.lang.String cannot be cast to java.util.Date

Obs: mantém-se os dados conforme acima anteriormente mencionados.

Eric_Yuzo

Pra isso é preciso implementar um TableModel que trabalhe com objetos do seu domínio (PessoaFisica).

Exemplos de como implementá-lo podem ser encontrados aqui: [url]http://www.guj.com.br/posts/list/15/199067.java#1001295[/url]

Tendo implementado um TableModel para a classe PessoaFisica, você pode criar um método que retorna a pessoa referente a uma linha da tabela ao invés de recuperar uma string.

Ficaria mais ou menos assim:
PessoaFisica pessoa = seuTableModel.getPessoa(jtableteste.getSelectedRow()); // recupera a pessoa referente a linha selecionada

Data.setDate(pessoa.getData()); // seta a data diretamente no calendar
Então, sugiro que tente implementar um TableModel com base nos exemplos do link acima e torne a postar caso surjam dúvidas.
Criado 24 de julho de 2011
Ultima resposta 27 de jul. de 2011
Respostas 5
Participantes 2