Somente números no JTextField

Procurei aqui mas não achei então vou perguntar:
Tem algum método prático para só permitir números em um JTextField?

Já aproveitando, alguém sabe algum link direto para baixar o Driver (.JAR) do FireBird e o para BD do Access( :? ).
Value.

Brother, ao invés de você instanciar o JTextField, utilize a classe LimitedIntegerJTextField (em anexo) que além de permitir apenas números, ainda pode-se definir o maxlength do campo.

Qualquer dúvida estamos por aqui.

Abraço.

eu fiz esse metodo

public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}

ai vc chama o metodo passando como parametro o JTextField

Valeu!

zizegaitero , nao consegui rodar o teu codigo no meu …

ai vai …

//package br.com.patterns.chain;

import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JTextField;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.JButton;
import javax.swing.event.CaretListener;
import javax.swing.event.CaretEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class Frame1 extends JFrame
{
private JTextField jTextField1 = new JTextField();

public Frame1() 
{ 
    try 
    { 
        jbInit(); 
    } 
    catch(Exception e) 
    { 
        e.printStackTrace(); 
    } 

} 

private void jbInit() throws Exception 
{ 
    this.getContentPane().setLayout(null); 
    this.setSize(new Dimension(400, 300)); 
    jTextField1.setText("jTextField1"); 
    jTextField1.setBounds(new Rectangle(15, 35, 165, 20)); 
    this.getContentPane().add(jTextField1, null); 
} 


public void ValidaNumero(JTextField Numero) { 
	long valor; 
	if (Numero.getText().length() != 0){ 
		try { 
			valor = Long.parseLong(Numero.getText()); 
		}catch(NumberFormatException ex){ 
			JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE); 
			Numero.grabFocus(); 
		} 
	} 
} 


public static void main(String args[]) 
{ 
    new Frame1().show(); 
} 

}

vc pode usar no momento que sai o foco do campo.
vc chama o método passando como parametro o nome do campo

ex: ValidaNumero(Campo);

vlw

Cara faz uma annotation que verifica isso, o codigo fica bem mais fácil assim…

É sempre melhor impedir que o usuário faça errado a abrir uma caixa de diálogo na cara dele depois que ele errou.

Uma solução adequada é esta:

public class NumberField extends JTextField {
    public NumberField() {
        this( null );
    }

    public NumberField( String text ) {
        super( text );
        setDocument( new PlainDocument() {
	    @Override
    	    public void insertString( int offs, String str, AttributeSet a ) throws BadLocationException {
                //normalmente apenas uma letra é inserida por vez,
                //mas fazendo assim também previne caaso o usuário
                //cole algum texto
                for( int i = 0; i < str.length(); i++ )
                    if( Character.isDigit( str.charAt( i ) ) == false )
                        return;

                super.insertString( offs, str, a );
            }
        } );
    }
}

Ola, amigo … me desculpe a pergunta mas, como devo utilizar essa classe ?? tipo igual a classe JtextFieldLimited … tfNomeFantasia.setDocument(new jTextFieldLimit(60)); ??? ou como devo fazer ???

[quote=Filipe Sabella]É sempre melhor impedir que o usuário faça errado a abrir uma caixa de diálogo na cara dele depois que ele errou.

Uma solução adequada é esta:

[code]
public class NumberField extends JTextField {
public NumberField() {
this( null );
}

public NumberField( String text ) {
    super( text );
    setDocument( new PlainDocument() {
    @Override
	    public void insertString( int offs, String str, AttributeSet a ) throws BadLocationException {
            //normalmente apenas uma letra é inserida por vez,
            //mas fazendo assim também previne caaso o usuário
            //cole algum texto
            for( int i = 0; i < str.length(); i++ )
                if( Character.isDigit( str.charAt( i ) ) == false )
                    return;

            super.insertString( offs, str, a );
        }
    } );
}

}
[/code][/quote]

Eu faria assim:

 MaskFormatter fmt = null;
 try{
	fmt = new MaskFormatter("##########");
 }catch(ParseException e){}

 JFormattedTextField tft2 = new JFormattedTextField(fmt);

http://www.exampledepot.com/egs/javax.swing.text/formtext_FormTextNum.html

[quote=zizegaitero]eu fiz esse metodo

public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}

ai vc chama o metodo passando como parametro o JTextField[/quote]

Valeu zizegaitero! Deu certinho para minha necessidade… Muito obrigado mesmo. Os créditos serão dados.

[quote=daniel.pedro_fernandes][quote=zizegaitero]eu fiz esse metodo

public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}

ai vc chama o metodo passando como parametro o JTextField[/quote]

Valeu zizegaitero! Deu certinho para minha necessidade… Muito obrigado mesmo. Os créditos serão dados.[/quote]

Também consegui segue abaixo:

//Coloquei o método na minha classe Utilitaria
public static void validaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0) {
try {
valor = Long.parseLong(Numero.getText());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números”, “Informação”, JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();// foca o campo
Numero.setText(""); //limpa o campo
}
}
}

//Quando perde o foco passo JTextField
private void bankCodFieldFocusLost(java.awt.event.FocusEvent evt) {
JTextField field = (JTextField) evt.getComponent();
Utilitaria.validaNumero(field);
}

Espero que ajude mais pessoas, com esse exemplo!

Respondendo ai , um que funciona para quem precisar


package vini.util;

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

public class NumberField extends JTextField {
 
     /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public NumberField(int cols) {
         super(cols);
     }
 
     protected Document createDefaultModel() {
 	      return new NumberDocument();
     }
 
     static class NumberDocument extends PlainDocument {
 
         /**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public void insertString(int offs, String str, AttributeSet a) 
 	          throws BadLocationException {
 
 	          if (str == null) {
 		      return;
 	          }
 	          for (int i = 0; i < str.length(); i++) {
 	        	  if(Character.isDigit(str.charAt(i))== false){
 	        		  return;
 	        	  }
 	          }
 	          super.insertString(offs, new String(str), a);
 	      }
     }
 }




galera o tópico é meio antigo, só que vim procurar isso e não achei uma resposta fácil por aqui.
mas juntanto umas 2 idéias achei um jeito muito simples, e faz essa verificação em tempo real, eis o código:

fieldNumero.addKeyListener(new java.awt.event.KeyAdapter() {     // cria um listener ouvinte de digitação do fieldNumero

            public void keyReleased(java.awt.event.KeyEvent evt) {  // cria um ouvinte para cada tecla pressionada
               
fieldNumero.setText(fieldNumero.getText().replaceAll("[^0-9]", "")); // faz com que pegue o texto a cada tecla digitada, e substituir tudo que não(^) seja numero  por ""

         }
});

para substituir para que só fiquem letras, basta alterar no replaceAll:

fieldNumero.setText(fieldNumero.getText().replaceAll("[^A-Z | ^a-z]", ""));

espero que tenha sido util, um abraço a todos.

2 curtidas

[quote=brenowbc]galera o tópico é meio antigo, só que vim procurar isso e não achei uma resposta fácil por aqui.
mas juntanto umas 2 idéias achei um jeito muito simples, e faz essa verificação em tempo real, eis o código[/quote]

Simples, mas infelizmente furado. Não use eventos para tratar entradas de teclas em componentes, pois em 90% das vezes, eles não são multiplataforma e eles escondem problemas.
Por exemplo, seu código falha se o usuário der CTRL+C num texto, e cola-lo no JTextField com o mouse (não haverá keypress nesse caso).

A forma correta de limitar um JTextField é através do objeto Document relacionado a ele. Eis aqui uma classe que limita o JTextField só a números, e limita também a quantidade máxima de dígitos dele:

E aqui está o artigo que explica como um Document funciona:
http://www.guj.com.br/articles/29

E aqui um artigo falando de Document, DocumentFilter e outros recursos:
http://download.oracle.com/javase/tutorial/uiswing/components/generaltext.html

2 curtidas

[quote=marcoscorso]zizegaitero , nao consegui rodar o teu codigo no meu …

ai vai …

//package br.com.patterns.chain;

import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JTextField;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.JButton;
import javax.swing.event.CaretListener;
import javax.swing.event.CaretEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class Frame1 extends JFrame
{
private JTextField jTextField1 = new JTextField();

public Frame1() 
{ 
    try 
    { 
        jbInit(); 
    } 
    catch(Exception e) 
    { 
        e.printStackTrace(); 
    } 

} 

private void jbInit() throws Exception 
{ 
    this.getContentPane().setLayout(null); 
    this.setSize(new Dimension(400, 300)); 
    jTextField1.setText("jTextField1"); 
    jTextField1.setBounds(new Rectangle(15, 35, 165, 20)); 
    this.getContentPane().add(jTextField1, null); 
} 


public void ValidaNumero(JTextField Numero) { 
	long valor; 
	if (Numero.getText().length() != 0){ 
		try { 
			valor = Long.parseLong(Numero.getText()); 
		}catch(NumberFormatException ex){ 
			JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE); 
			Numero.grabFocus(); 
		} 
	} 
} 


public static void main(String args[]) 
{ 
    new Frame1().show(); 
} 

}
é melhor fazer isso pra entender melhor o codigo.
[/quote]

Eu só coloquei melhor pra entender!

//package br.com.patterns.chain; 


import javax.swing.JFrame; 
import java.awt.Dimension; 
import javax.swing.JTextField; 
import java.awt.Rectangle; 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeEvent; 
import javax.swing.JButton; 
import javax.swing.event.CaretListener; 
import javax.swing.event.CaretEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.KeyEvent; 
import javax.swing.*;


public class Frame1 extends JFrame 
{ 
    private JTextField jTextField1 = new JTextField(); 

    public Frame1() 
    { 
        try 
        { 
            jbInit(); 
        } 
        catch(Exception e) 
        { 
            e.printStackTrace(); 
        } 

    } 

    private void jbInit() throws Exception 
    { 
        this.getContentPane().setLayout(null); 
        this.setSize(new Dimension(400, 300)); 
        jTextField1.setText("jTextField1"); 
        jTextField1.setBounds(new Rectangle(15, 35, 165, 20)); 
        this.getContentPane().add(jTextField1, null); 
	} 


	public void ValidaNumero(JTextField Numero) { 
		long valor; 
		if (Numero.getText().length() != 0){ 
			try { 
				valor = Long.parseLong(Numero.getText()); 
			}catch(NumberFormatException ex){ 
				JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE); 
				Numero.grabFocus(); 
			} 
		} 
	} 


    public static void main(String args[]) 
    { 
        new Frame1().show(); 
    } 
}

no meu despertador uso um try catch, da para olhar o código, lá no final do tópico , ±

tá aqui o link ± certo, tem que retroceder um pouquinho, tem o despertador jar e o código abaixo,
mas para funcionar, não esqueça de pegar o som, bem no inicio do tópico, que ainda precisa ir no diretorio c://

[quote=zizegaitero]eu fiz esse metodo

public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}

ai vc chama o metodo passando como parametro o JTextField[/quote]

Só pra entender o código!


 public void ValidaNumero(JTextField Numero) {
        long valor;
        if (Numero.getText().length() != 0){
            try {
                valor = Long.parseLong(Numero.getText());
            }catch(NumberFormatException ex){
                JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE);
                Numero.grabFocus();
            }
        }
    }

Pegando carona na dúvida do colega, utilizei a seguinte validação para esse problema:

String cnpj = jTextField10.getText();

        if (cnpj.length() == 14) {
            for (int i = 0; i < cnpj.length(); i++) {
                if (Character.isDigit(cnpj.charAt(i))) {
                    System.out.println("numero: "+cnpj.charAt(i));
                    //return;
                } else {
                    System.out.println("letra: "+cnpj.charAt(i));
                    JOptionPane.showMessageDialog(null, "Digite somente números", "CNPJ do cliente", JOptionPane.INFORMATION_MESSAGE);
                    // jTextField10.setFocusable(true);
                    return;
                }
            }
        }else{
            JOptionPane.showMessageDialog(null, "Numeração inválida", "CNPJ do cliente", JOptionPane.INFORMATION_MESSAGE);
        }

Apesar dessa validação exibir as mensagens corretamente, continuo tendo um problema onde o usuario pode continuar o cadastro sem nenhum impedimento. Como posso manter o focu no campo até que o usuario digite corretamente as informações e ainda, qual opinião de vocês no que diz respeito a memoria, processamento e segurança para as demais soluções?