Formatar JTextField

6 respostas
P

Pessoal

Eu estou tentando fazer uma máscara para o meu JTextField para ser um campo onde vai ser entrado um valor monetário.

Criei uma classe que extende PlainDocument. Segue a classe:

class MoedaDocument extends PlainDocument{    
	  
	private static final long serialVersionUID = 5091878348512314283L;

	
	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
		String texto = getText(0,getLength());
		
		if(texto.length()&lt10){
			remove(0,getLength());
			StringBuffer strBuf = new StringBuffer(texto.replaceAll(",","")+str);
			
			for (int i = 0; i &lt strBuf.length(); i++){
				if (!isDigit(strBuf.charAt(i))){
					strBuf.deleteCharAt(i);
				}
			}
			//novo
			if (strBuf.charAt(0) == '0'){
				strBuf.deleteCharAt(0);
			}
			
			if(strBuf.length() == 1){
				strBuf.insert(0,"0");
				strBuf.insert(0,",");
				strBuf.insert(0,"0");
			}
			else if(strBuf.length() == 2){
				strBuf.insert(0,",");
				strBuf.insert(0,"0");
			}
			else if(strBuf.length() == 0){
				strBuf.insert(0,"0");
				strBuf.insert(0,"0");
				strBuf.insert(0,",");
				strBuf.insert(0,"0");
			}
			else
				strBuf.insert(strBuf.length()-2,",");
			
			
			
			
			super.insertString(0, strBuf.toString(), a);
		}
	}
}

O método isDigit(char a) devolve true caso o char for numérico.

A máscara ta funcionando perfeitamente. Toda vez que mais um caractere é entrado minha classe varre e atualiza a String para deixar duas casas decimais.

O problema é quando o usuário apaga o último dígito, ou outro qualquer, que faz perder a formatação correta.

Quando um caractere é entrado, minha classe chama o método insertString(…). Qual método é chamado quando o usuário aperta o backspace? Qual método deve fazer o override para tratar esse evento?

Desde já agradeço a ajuda de vocês.

6 Respostas

bcartaxo

Kra, uma dica, se vc quer fazer uma máscara num JTextField existem mecanismos do java já pronto pra isso. Dá uma pesquisada na classe JFormattedTextField e na MaskFormatter. Se n me engano é isso.

Abraço

P

Sim, eu conheço, mas para gerar a máscara de moeda sempre completando os valores com zeros, o JFormattedTextField não serve. Precisaria implementarmesmo esse componente.

Mas vcalew pela dica

Alguém pode me ajudar?

Obrigado

P

Ninguém?

T

Puxia, eu precisava de um componente desses. (JFormattedTextField é pura “enganação”, normalmente não funciona bem).

Será que isto não ajuda?
Document.remove

P

Vou testar e qualquer resultado posto aqui

Obrigado thingol

P

thingol, valeu pela dica cara.

Consegui implementar. Me parece que está funcionando sem problemas.

Você disse que talvez precisasse de um componente desses, então vou postar a minha classe que extende PlainDocument, assim, você ou qualquer pessoa ai que precisar vai ter isso pronto.

De novo obrigado pela ajuda e espero que a classe pronta também ajude o pessoal.

class MoedaDocument extends PlainDocument{    
	  
	private static final long serialVersionUID = 5091878348512314283L;

	boolean isDigit (char c){
		if (c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9' || c == '0'){
			return true;
		}
		return false;
	}
	
	public void remove(int offs, int len) throws BadLocationException {
				
		super.remove(offs, len);
		
		if (len == 1){
			insertString(0, "", null);
		}
	}
	
	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
		String texto = getText(0,getLength());
		
		if(texto.length()&lt10){
			System.out.println("aqui");
			remove(0,getLength());
			System.out.println("aqui2");
			StringBuffer strBuf = new StringBuffer(texto.replaceAll(",","")+str);
			
			for (int i = 0; i &lt strBuf.length(); i++){
				if (!isDigit(strBuf.charAt(i))){
					strBuf.deleteCharAt(i);
				}
			}
			//novo
			if (strBuf.charAt(0) == '0'){
				strBuf.deleteCharAt(0);
			}
			
			if(strBuf.length() == 1){
				strBuf.insert(0,"0");
				strBuf.insert(0,",");
				strBuf.insert(0,"0");
			}
			else if(strBuf.length() == 2){
				strBuf.insert(0,",");
				strBuf.insert(0,"0");
			}
			else if(strBuf.length() == 0){
				strBuf.insert(0,"0");
				strBuf.insert(0,"0");
				strBuf.insert(0,",");
				strBuf.insert(0,"0");
			}
			else
				strBuf.insert(strBuf.length()-2,",");
			
			
			
			super.insertString(0, strBuf.toString(), a);
		}
	}
	
}

Abraços

Criado 27 de junho de 2007
Ultima resposta 28 de jun. de 2007
Respostas 6
Participantes 3