Controlando o delete no JFormattedTextField

controlando-o-delete-no-jformattedtextfield

Recentemente fui requisitado a pesquisar sobre como permitir o usuário ao pressionar o delete e remover um valor do campo com mascara e ao digitar novamente o novo valor seja inserido exatamente na mesma posição onde o delete removeu o valor antigo.
Pesquisando cheguei na documentação da Oracle onde dizia que por padrão do Java a classe MaskFormatter não permitia remover o valor vazio da mascara, toda posição sem valor na mascara seria automaticamente substituída com espaços, com isso quando o delete era pressionado o valor é removido sendo substituído por um espaço e o cursor avança uma posição, obrigando sempre o usuário a retornar as casas para digitar o novo valor.
Mas como no Java sempre tem uma alternativa ou melhor uma reimplementação cheguei a conclusão que seria possível criando a minha própria classe de MaskFormatter.

Video da implementação da solução

 

 

Abaixo segue a classe MyMaskFormatter desenvolvida que reimplementa os métodos.

package MyMaskFormatter;

import java.text.ParseException;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.MaskFormatter;

public class MyMaskFormatter extends MaskFormatter {
	private static final long serialVersionUID = 4967188238454402594L;

	private DocumentFilter filter;

	public MyMaskFormatter(String string) throws ParseException {
		super(string);
	}

	@Override
	protected DocumentFilter getDocumentFilter() {
		if (filter == null) {
			filter = new MyDocumentFilter(super.getDocumentFilter());
		}
		return filter;
	}

	public class MyDocumentFilter extends DocumentFilter {
		DocumentFilter delegate;

		MyDocumentFilter(DocumentFilter delegate) {
			this.delegate = delegate;
		}

		/*Remove os caracteres*/
		@Override
		public void remove(FilterBypass fb, int offset, int length)
				throws BadLocationException {
			delegate.remove(fb, offset, length);
			int sublength = fb.getDocument().getLength() - offset;
			String text = fb.getDocument().getText(offset, sublength);
			text = text.substring(1) + text.charAt(0);
			replace(fb, offset, sublength, text, null);
			getFormattedTextField().setCaretPosition(offset);
		}
		
		/*Insere os caracteres na posição*/
		@Override
		public void insertString(FilterBypass fb, int offset, String string,
				AttributeSet attr) throws BadLocationException {
			delegate.insertString(fb, offset, string, attr);
		}

		/*Faz a troca dos caractes*/
		@Override
		public void replace(FilterBypass fb, int offset, int length,
				String text, AttributeSet attrs) throws BadLocationException {
			delegate.replace(fb, offset, length, text, attrs);
		}
	}

}

Implementação


			MyMaskFormatter format = new MyMaskFormatter("###.###.###-##");
			JFormattedTextField formattedTextField = new JFormattedTextField(new DefaultFormatterFactory(format));
			formattedTextField.setPreferredSize(new Dimension(200, 20));

			JFrame frame = new JFrame("MyMaskFormatter");
			frame.setSize(400, 20);
			frame.add(formattedTextField);
			frame.setLocationRelativeTo(null);
			frame.setVisible(true);

downloadDownload do exemplo

Curso recomendado para você

Selecionei os cursos on-line para você se preparar e abrir as portas para as vagas de programação. Conheça cada um dos cursos nos links oficiais abaixo. 🙂

Curso Profissional + Certificado + Acesso Vilatício + Suporte


Formação Java Web Profissional - Cursos em Java
Full-Stack Web Java EE
Mais de 600 aulas em PrimeFaces, JSF, Spring, Hibernate, JPA, Ireport, CDI e muitos mais. Iremos do básico ao avançado.
2.985 alunosHoras do curso - Cursos em Java 150h Horas do curso certificado

600+ aulas. A melhor forma de aprender a desenvolver sistemas em Java é tendo como exemplo um projeto e curso completo onde possa observar o código para melhor entendimento do funcionamento das rotinas a acompanhar as vídeos aulas de desenvolvimento. Esse curso contém tudo que um desenvolvedor precisa saber para entrar no mercado de trabalho.
Desenvolvedor(a) Full-Stack
Full-Stack Web PHP
Domine as principais tecnologias do mercado e se torne Desenvolvedor Full-Stack, com salários na faixa dos R$5.000,00.
1.600 alunosHoras do curso 150h Horas do curso certificado

Adquira hoje o curso e tenha acesso ao mesmo para sempre. Você pode se inscrever hoje e estudar no seu ritmo, pois o curso nunca vai expirar.

 


 


Acesse
Cursos e Projetos
Java
Acesse
Outros Cursos
PHP MySQL Android
Acesse
Encomende um Projeto
Feito pra Você
Acesse
Tire as Dúvidas On-line
Consultor
Acesse
Aulas de Java só suas
Encomende Agora
Acesse
Dividindo Conhecimento
Posts e Tutoriais
Acesse
Sites e Parceiros
Associados
Acesse
Conheça os curso gratuitos
Grátis

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

 

Depoimento de aluno


 
Alunos Felizes
 
Alunos Felizes
 
Alunos Felizes
 
Instrutor Java Quer se tornar aluno VIP? CLIQUE AQUI!
Instrutor Java

Alex Fernando Egidio
Autor, criador e fundador do JDev Treinamento on-line. Atua no mercado como desenvolvedor e engenheiro de sistemas em Java é apaixonado por desenvolvimento web em Java e pela “mágica” que seus frameworks trazem para o dia a dia de nós desenvolvedores.
Com mais de 10 anos de experiência ajuda programadores do Brasil todo a se tornarem profissionais.