Existe JTextField numérico?

5 respostas
dsiviotti

Oi pessoal,

Estava escrevendo uns programas aqui em casa quando lembrei de um recurso que sempre uso em meus programas: uma caixa de texto númérica. Onde o usuário apenas consegue digitar números e evitando assim tratamentos desnecessários. Pensei, então, em como fazê-lo em java, pois é possível fazer en Delphi/Vb criando um evento genérico que impede que caracteres fora so set [‘0’…‘9’,’,’] não sejam sequer mostrados. Descobri que em java eu, na verdade, deveria fazer uma classe que implementa KeyListener e passar para o JTextField (bem mais elegante). Implementei esta classe e fiquei com algumas dúvidas:

  1. Já existe esta implementação ou uma propriedade do JTextField para isso?
  2. O teste é feito com o código abaixo:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;


public class KeyAdapterNumeric implements KeyListener {
	
	JTextField txt = null;
	boolean isFloat = false;
	
	public KeyAdapterNumeric(JTextField jTextField, boolean canBeFloat) {
		super();
		txt = jTextField;
		isFloat = canBeFloat;		
	}

	public void keyTyped(java.awt.event.KeyEvent evt) {
		String tmp = txt.getText(); 
		String newText = tmp + evt.getKeyChar();
		System.out.println(newText); // só para debug 
		try {
			if (isFloat) {
				float f = Float.parseFloat(newText);
			} else {
				int i = Integer.parseInt(newText);
			}			
		} catch (Exception e) {
			evt.setKeyChar(KeyEvent.CHAR_UNDEFINED);
			txt.setText(tmp);  // devolve o antigo e ignora o novo
		}  	 
	}

	public void keyPressed(KeyEvent e) {}

	public void keyReleased(KeyEvent e) {}
	
}

quando verifico se o texto é um float válido tenho que usar o float com . (ponto) e não , (vírgula). Como resolver isto?

  1. O Contructor recebe um objeto JTextField. Tentei passar JTextComponent para servir para outros TextFields (assim funciona só para JTextField) mas não consegui usar e me danei todo tentando fazer um casting válido (tipo getClass) mas nada funcionou. Qual superclasse eu devo passar como parâmetro?

Se alguém puder responder eu agradeço… :smiley:

5 Respostas

Luca

Olá

Seus problemas acabaram. Chegou JMaskField

Artigo de Claude Duguay no Java Developer’s Journal de 1 de Janeiro de 1999
http://sys-con.com/story/?storyid=36096&DE

Source code:
http://photos.sys-con.com/story/res/36096/source.html

O Claude tb tinha um site mas não encontrei mais no google.

[]s
Luca

dsiviotti

Ok. Dá pra usar o JFormattedTextField , mas será que é possível resolver a questão da superclasse já que JTextComponent não pode ser instanciado?

eu tentei algo como

JTextComponent  txt = (JTextField) jTextComponent;
JTextComponent  txt = ( jTextComponent.getClass() ) jTextComponent

entre outros e não deu certo. O casting deveria receber um parâmetro JTextComponent onde eu poderia por um JTextField e jogar em “txt” que é um JTextComponent. É possível?

luiz_ross

Eu fiz uma classe que faz exatamente isso que vc quer, mais tarde vejo se consigo postar ela pra vc :wink:

Marques

Procure por jFormattedTextField

N

Da uma olhada em javax.swing.JFormattedTextField e em javax.swing.text.MaskFormatter!

Uma pesquisada no fórum, acho que alguém já teve a sua dúvida!!

Criado 28 de janeiro de 2004
Ultima resposta 28 de jan. de 2004
Respostas 5
Participantes 5