JTextField que aceita somente números!

6 respostas
E

[color=red] Bem galera, como todo mundo que está começando, eu tb tive essa dúvida. Como criar um JTextField que aceite somente números?
Pois bem! Tentei criar um que aceita somente números (0, 1,2,3…,9) e UMA VIRGULA SÓ!
Se o usuário errar na digitação, o JTextField se anula TOTALMENTE.
O que vcs acham?
Desde já obrigado!
[/color]

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;;

	class JText extends JFrame{
		private JLabel txt;
		private JTextField txtNumber;
		private JButton btoOk;
		
		public JText(){
			txt = new JLabel("Digite um número:");
			txtNumber = new JTextField("");
			btoOk = new JButton("Ok!");			
			Container co = getContentPane();
			co.setLayout(new GridLayout(2,2));
			
			co.add(txt);
			co.add(txtNumber);
			co.add(new JLabel(""));
			co.add(btoOk);
						
			
			this.addWindowListener(new WindowAdapter(){
				public void windowClosing(WindowEvent e){
					System.exit(0);
				}
			});
		
					
			txtNumber.addKeyListener(new KeyAdapter(){
				public void keyReleased(KeyEvent e){
					onlyNumbers(txtNumber, e.getKeyCode());
				}
			});
		}
		
		public static void onlyNumbers(JTextField c, int key){
			boolean validade;
			validade = false;
			
			for(int i = 96; i<=105; i++){
				if((key == i || key==(i-48) || key == 8) || (key == 110 && (c.getText().indexOf(",")==c.getText().length()-1))){
					validade = true;
					break;
				}
			}

			if(validade){
		
			}
			else{
				c.setText("");
			}
		}

		public static void main(String args[]){
			JText j = new JText();
			j.pack();
			j.setResizable(false);
			j.setVisible(true);
		}
	}

6 Respostas

E

Ah! Antes, deixa eu explicar a linha 42:

Números:
key == i --> teste para ver se o usuário digitou um número do NUMPAD (As teclas 0,1,2,3…9 variam de 96 a 105).
key == ( i-48 ) --> teste para ver se o usuário digitou um número do teclado (As teclas 0,1,2,3…9 variam de 48 a 57).
key == 8 --> teste para ver se o usuário digitou backspace

Vírgula
key == 110 && (c.getText().indexOf( "," ) == c.getText().length()-1)) --> teste para ver se o usuário digitou " , " e se ela é única!

R

E aí cara tudo bem?

Não sei se você tinha um objetivo mais específico ao fazer esse código, mas existe também a possibilidade de você utilizar máscaras e um JFormattedTextField para tratar isso.
Você poderia fazer algo do tipo:

MaskFormatter mascara = null;
        try
        {
          mascara = new MaskFormatter("####,###");   
        }
        catch(ParseException ex)
        {
            ex.printStackTrace();
        }
        JFormattedTextField txtNumber = new JFormattedTextField(mascara);
E

Blz, Ricardo!
De início só estou praticando mesmo…
Achei legal construir meu próprio método onlyNumbers().

Mas quero testar esse recurso que vc falou mesmo, já que estou aprendendo um pouco de cada mesmo.

Vlw, chegado.

ViniGodoy

Oi.

Para controlar um JTextField (ou JTextArea, ou JTextPane, ou qualquer outro JTextComponent), é necessário controlar o Document dele.
Você pode ver esse artigo, que ensina a fazer isso, e então tentar modificar o exemplo descrito ali para fazer o que você quer (não é difícil, eu mesmo já fiz isso). Aí vc cria o seu próprio OnlyNumberDocument.

Ah sim, para testar se um caracter é número ou não, pode-se usar a função Character.isDigit.

A

e se vc tiver uns 1000 JTextField, vai ter q por um keyTyped pra cada um… dexa o campo livre e valide com expressoes regulares, minimiza teu trabalho

ViniGodoy

Usar o KeyTyped é a pior forma de se fazer isso. Uma grande falha do método está no fato que o usuário pode colar texto com CTRL+V ou com o mouse.
E isso não dispara o evento.

Há outras formas de resolver o problema:

  1. Você pode deixar o usuário digitar o que quiser, e só reclamar na hora de dar o save. Essa é uma boa se for sua classe de negócio a responsável por validar boa parte dos dados.
  2. Você pode adicionar um InputVerifier. Ele reclama do erro quando o usuário tenta sair do campo (eu particularmente não gosto dessa forma. Geralmente, priorizo o que deixa o usuário digitar livremente, sem nem sequer olhar para tela. Assim ele pode ter mais velocidade na inserção de dados);
Criado 30 de agosto de 2008
Ultima resposta 31 de ago. de 2008
Respostas 6
Participantes 4