Problema com JFormattedTextField e MaskFormatte

8 respostas
EderBaum

tenho o seguinte código:

MaskFormatter mf = new MaskFormatter(“UUUUU”); /Permite digitar até 5 letras maiusculas/
JFormattedTextField field = new JFormattedTextField(mf);

No caso a mascara permite digitar no máximo 5 letras em upercase.
Se eu der um tab e ir para o próximo campo e tiver digitado no “field1” algo como “EU” que tem apenas 2 letras, o campo fica vazio.

Meu objetivo é criar algo em que o cara possa digitar no máximo X letras e o que vier abaixo ele aceite mesmo assim.
Outra coisa é o comportamento estranho do JFormattedTextField em que com o mouse ou seta para direita eu posso ir digamos a posição 4 do campo sem digitar nada. queria evitar isso.

Alguém pode me ajudar?

8 Respostas

EderBaum

O problema do TAB resolvi com isso:

field.setFocusLostBehavior(JFormattedTextField.PERSIST);

Só falta agora o comportamento estranho do JFormattedTextField em que com o mouse ou seta para direita eu posso ir digamos a posição 4 do campo sem digitar nada

Alguém ai?

Rodrigo_Manhaes

O uso de JFormattedTextField se justifica quando você realmente tem uma máscara para edição (por exemplo: datas, CEP ou CPF), o que realmente não é o seu caso.

Para o que você deseja, aconselho o uso de JTextField comum auxiliado por um InputVerifier. Por exemplo, para que o componente aceite no máximo 5 letras em caixa-alta, o código é extremamente simples:

class CincoLetrasUpperCaseVerifier extends InputVerifier { public boolean verify(JComponent input) { JTextField tf = (JTextField) input; String text = tf.getText(); if (text.length() > 5) text = text.substring(0, 5); tf.setText(text.toUpperCase) return true; } }
Para ligar o verifier ao componente, faça

Um verifier serve para validar o conteúdo de um widget (retornando false caso a entrada seja inválida), mas pode-se através dele transformar o valor de um componente, como é feito aqui, truncando o conteúdo caso tenha mais de 5 caracteres e convertendo-o para maiúsculas. Note que a validação é feita quando da perda do foco, ou seja, o componente aceitará minúsculas e mais que cinco caracteres. Na perda do foco é que a conversão será executada.

PS: Não estou com o JSE neste computador, de modo que o código pode conter alguma eventual “irregularidade”, mas a idéia é esta.

EderBaum

Este é o problema, eu queria algo mais “instantãneo”

Rodrigo_Manhaes

Mas que diferença faz?

EderBaum

A diferença é que:

Imagine que eu tenho um campo que vai código de barras.

  • Um código de barras é numérico e tem 13 digitos
  • Ai a anta do usuário digita uma palavra ou letras, ou coisa inválida que dê um certo trabalho
  • Ele só vai descobrir que errou a coisarada toda depois que dêr TAB.

Deve existir algo, pois em linguagens como Dataflex(Super arcaico) tem isso

EderBaum

Parece que DocumentFilter resolve meu problema.

vou dar uma estudad

EderBaum

FUNCOU!!!

Ufffa, é por isso que a persistência vale a pena;

Veja o result ai

import javax.swing.*;
public class UpcaseFilter extends DocumentFilter {

	public void insertString(DocumentFilter.FilterBypass fb, int offset,
			String text, AttributeSet attr) throws BadLocationException {
		fb.insertString(offset, text.toUpperCase( ), attr);
	}

	public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
			String text, AttributeSet attr) throws BadLocationException {
		fb.replace(offset, length, text.toUpperCase( ), attr);
	}
	
	public static void main(String[] args) {
	    DocumentFilter dfilter = new UpcaseFilter( );	    
	    JTextField jtf = new JTextField( );	    
	    ((AbstractDocument)jtf.getDocument()).setDocumentFilter(dfilter);	    
	    JFrame frame = new JFrame("UpcaseFilter");	    
	    frame.getContentPane( ).add(jtf, java.awt.BorderLayout.SOUTH);	    
	    frame.setSize(200, 120);
	    frame.setVisible(true);	    

	}

}

Relativamente complexo, mas Perfeito

Rodrigo_Manhaes

Não conhecia o DocumentFilter, valeu a dica! Desenvolvemos um mini-framework Swing para uso interno, vou substituir os InputVerifier por DocumentFilter sempre que a função do primeiro for simplesmente filtrar e não validar. Muito bom mesmo!

Criado 8 de setembro de 2006
Ultima resposta 11 de set. de 2006
Respostas 8
Participantes 2