Que EVENTO usar em um jTextField ? [validar data]

16 respostas
A

Boa tarde pessoal

É o seguinte: Preciso validar a data de um campo b[/b]! Se a data for invalida ele monstra
uma mensagem de erro…

O codigo p Validar a data vai ficar dentro do jTextField5. Minha duvida é: Que EVENTO eu vou utilizar nesse jTexfiled5 ?

Vou colar o codigo p validar data aqui:

Date data = null;
                String dataTexto = new String(jTextField5.getText());
                SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
                try {
                        format.setLenient(false);
                        data = (Date) format.parse(dataTexto);
                } catch (ParseException e) {
                JOptionPane.showMessageDialog(null,
                            "Data inválida. Tente novamente!",
                            "AVISO",
                            JOptionPane.WARNING_MESSAGE);
                }

O problema nao eh o codigo… O problema é o EVENTO !

Abraços

16 Respostas

C

Você pode validar na hora que o formulario for submetido, cadastrado, ou enfim.
O evento não precisa ser do textfield, pode ser de um click de botao que esteja dentro do formulario.

A

chimufox:
Você pode validar na hora que o formulario for submetido, cadastrado, ou enfim.
O evento não precisa ser do textfield, pode ser de um click de botao que esteja dentro do formulario.

Entendi… Mas eu to querendo fazer isso no jTextField… No meu caso, vai ficar melhor…

Vc sabe como ?

V

Kra, se for pra validar ao sair do campo da pra usar o focusLost, ele irá disparar toda vez que perder o foco no campo.
Pode ser o keyPressed também, mas ai tem que ter cuidado pra não mostrar o erro toda hora.

A

Oi,

Use o evento ActionPerformed…

V

Resposta correta: Nenhum evento.

Dificilmente eventos resolvem qualquer tipo de problema num JTextField. Se você quer validar a data durante a digitação, você usa um Document:
http://www.guj.com.br/java/942-controlando-um-jtextfield

Se você quer disparar uma mensagem de erro após sair do campo, você usa um InputVerifier:
http://download.oracle.com/javase/6/docs/api/javax/swing/InputVerifier.html

Você só usa um evento se houver um botão de “salvar”. Nesse caso, o actionPerformed do salvar faz a validação, fora do JTextField. Agora, jamais use KeyPressed ou LostFocus para validar um JTextField.

No caso do KeyPressed, ele não só não é multiplataforma como ele só captura teclas. Se o usuário colar um valor inválido com o mouse, o código quebra. No caso do focusLost, o problema é que, além de não ser multiplataforma, componentes podem receber e perder foco a qualquer momento, inclusive em alguns que você não espera.

A

Anime:
Oi,

Use o evento ActionPerformed…

Vai ter q ser no ActionPeformed mesmo…

So vou me bater um pouco p juntar ele com o restante do codigo…

try {
            /* Instanciando a classe do driver através do seu nome */
            Class.forName(DRV);
            System.out.println("Driver JDBC carregado");
        } catch (ClassNotFoundException cnfe) {
            System.out.println("Driver JDBC não encontrado : "
                    + cnfe.getMessage());
        }
        //}

        try {
            /* Obtendo a conexão com o banco de dados */
            con = DriverManager.getConnection(URL2, USUARIO, SENHA);
            System.out.println("Conexão com o banco de dados estabelecida.");
        } catch (SQLException sqle) {
            System.out.println("Erro na conexão ao Bando de Dados : "
                    + sqle.getMessage());
        }

        /* Criando conexão com o banco de dados */
        //Insere um novo registro no BD

        try {
            // String sql = null;

            /* Carregando o driver JDBC para um determinado SGBD */
            System.out.println("Inserindo dados....");

            //INSERT na tabela Movimentacao

            PreparedStatement insere = con.prepareStatement("insert into movimentacao "
              + "(codigo_funcionario,"
              + "codigo_produto,setor_destino,data_movimentacao,observacao) VALUES (?,?,?,?,?)   ");


            String codigoFuncionario = ("16");
            String codigoProduto = jTextField1.getText();
            String setorDestino = jTextField2.getText();
            String dataMovimentacao = jTextField5.getText();
            String observacao = jTextArea1.getText();
            String estado = jComboBox1.getSelectedItem().toString();

            insere.setString(1, codigoFuncionario);
            insere.setString(2, codigoProduto);
            insere.setString(3, setorDestino);
            insere.setString(4, dataMovimentacao);
            insere.setString(5, observacao);
            //insere.setString(6, estado);
            insere.executeUpdate();

            //UPDATE na tabela Produtos
            String sql = " UPDATE produtos set estado='" + jComboBox1.getSelectedItem() + "' "
                    + "where codigo_produto='" + jTextField1.getText() + "'";

            PreparedStatement ps = con.prepareStatement(sql);
            ps.executeUpdate();

            System.out.println("Atualizando dados");



        } catch (SQLException sqle) {
            System.out.println("Erro na conexão ao Bando de Dados : "
                    + sqle.getMessage());
        }
        /* fechando a conexão com o SGBD */
        try {
            con.close();
            JOptionPane.showMessageDialog(null, " Movimentação concluída. ");
            jTextField1.setText(""); //Limpando os JTextFields
            jTextField2.setText("");
            jTextField3.setText("");
            jTextField4.setText("");
            jTextField7.setText("");
            jTextField5.setText("");
            jTextField6.setText("");
            jTextArea1.setText("");


        } catch (SQLException sqle) {
            System.out.println("Erro no fechamento da conexão : ");
        }
V

Aproveitando. Tópico movido para o fórum de interface gráfica. Por favor, leia com atenção a descrição dos fóruns antes de postar.

V

ViniGodoy:
Resposta correta: Nenhum evento.

Dificilmente eventos resolvem qualquer tipo de problema num JTextField. Se você quer validar a data durante a digitação, você usa um Document:
http://www.guj.com.br/java/942-controlando-um-jtextfield

Se você quer disparar uma mensagem de erro após sair do campo, você usa um InputVerifier:
http://download.oracle.com/javase/6/docs/api/javax/swing/InputVerifier.html

Você só usa um evento se houver um botão de “salvar”. Nesse caso, o actionPerformed do salvar faz a validação, fora do JTextField. Agora, jamais use KeyPressed ou LostFocus para validar um JTextField.

No caso do KeyPressed, ele não só não é multiplataforma como ele só captura teclas. Se o usuário colar um valor inválido com o mouse, o código quebra. No caso do focusLost, o problema é que, além de não ser multiplataforma, componentes podem receber e perder foco a qualquer momento, inclusive em alguns que você não espera.

Que legal, então o KeyPressed e LostFocus existem pra bonito… Já que não se pode usar…

C

o evento pode ser ao conteudo do text field mudar, nao me recordo exatamente da representacao de classe desse veento…

V

Ironicamente, é isso mesmo.

E adivinha como eu descobri o InputVerifier? Com eventos sendo disparados mais vezes do que eu queria.
Aliás, uma rápida pesquisa no google acha gente com o mesmo problema: http://www.thatsjava.com/java-core-gui-apis/50044/

V

Ironicamente, é isso mesmo.

E adivinha como eu descobri o InputVerifier? Com eventos sendo disparados mais vezes do que eu queria.
Aliás, uma rápida pesquisa no google acha gente com o mesmo problema: http://www.thatsjava.com/java-core-gui-apis/50044/

Estou começando a usar o java web profissionalmente, esse tipo de coisa é bom pra deixar o cara atento…

V

Nesse caso, é Java para desktop mesmo. Mas é sempre bom ler e reler a documentação. Tem muitas dicas como essa por lá.

A

Bom galera,

so acontece essas catástrofes mencionadas acima, nos componentes textfields de mudança de focus ou chamadas várias vezes, ou até em relação ao keyPressed, se o programador não tiver o controle total da aplicação, por que se tiver, dificilmente terá problemas. Trabalho com uma aplicação que faz validações em CPF, DATAS, LOGINS EXISTENTES, USUÁRIOS EXISTENTES, usando o lostFocus, keyPressed, TAB e tudo mais. Confesso, nunca tive problemas, cadastro normalmente, se der erro no campo, o mesmo é sinalizado com uma cor informando ao usuário que esta com erro, o mesmo vai lá e concerta e cadastra normalmente.

#FICA A DICA!!

V

Acontece que o programador nunca tem total controle da aplicação. Ou você está implementando todo mecanismo de foco do Swing, em todas as plataformas que o Java é suportado?
Quem pede para usar o Document e o InputVerifier não sou eu, é a documentação. É a própria Oracle que não recomenda o uso de foco para validação de dados.

Se sua aplicação está funcionando, você pode estar com uma bomba relógio nas mãos.
Bons programadores fazem sistemas confiáveis, não simplesmente “fazem funcionar”.

A

é uma caso a se verificar… irei rever melhor a documentação. Porém, além desse problema, estou com um pior. Estou desenvolvendo 4 sistemas pra um cartório, com tela de login, tela de escolha de sistema, e a tela do sistema escolhido, e o erro é que quando efetua o logon, se autorizado, ‘setVisible(false)’ na tela de login, instancio a tela de escolha do sistema, depois de escolhido o referido sistema, mais um setVisible(false) na tela de escolha de sistema, e instancio a tela do sistema, mais na hora de voltar do sistema principal para a tela de escolha de sistema ou para a tela de login, NÃO estou sabendo manipular os objetos criados, e então, cria denovo, da tilts, abre multiplas janelas. Se puderem me ajudar. Estou pensando em fazer com DIALOG modais. Pode ser uma solução.

A

é uma caso a se verificar… irei rever melhor a documentação. Porém, além desse problema, estou com um pior. Estou desenvolvendo 4 sistemas pra um cartório, com tela de login, tela de escolha de sistema, e a tela do sistema escolhido, e o erro é que quando efetua o logon ‘setVisible(false)’ na tela de login, instancio a tela de escolha do sistema, depois de escolhido o referido sistema, mais um setVisible(false) na tela de escolha de sistema, e instancio a tela do sistema, mais na hora de voltar do sistema principal para a tela de escolha de sistema ou para a tela de login, NÃO estou sabendo manipular os objetos criados, e então, cria denovo, da tilts, abre novas janelas. Se puderem me ajudar. Estou pensando em fazer com DIALOG modais. Pode ser uma solução.

Criado 22 de julho de 2011
Ultima resposta 29 de dez. de 2011
Respostas 16
Participantes 6