Desenvolvi uma método que permite que o sistema identifique qual tipo de mascara para o telefone será utilizado, ele serve para telefones de:
- 8 caracteres( 0000-0000 ); Sem DDD
- 9 caracteres( 00000-0000 ); Sem DDD para novos telefones
- 10 caracteres( (00)0000-0000 ); Com DDD
- 11 caracteres( (00)00000-0000 ) ou ( 0800 000-0000 ); Com DDD para novos telefones ou 0800, ele gera um Pop-up para selecionar o tipo desejado;
Como eu possuo varios JFormattedTextField que usaram este método, eu coloco como valor de entrada no método o nome do campo alterado.
private void mudaMascaraTelefone(JFormattedTextField format) {
try {
format.setValue(null);
String nome = format.getText().replaceAll("-", "").replaceAll("\\(", "").replaceAll("\\)", "");
final MaskFormatter mask = new MaskFormatter();
switch (nome.length()) {
case 8:
mask.setMask("####-####");
format.setFormatterFactory(new DefaultFormatterFactory(mask));
break;
case 9:
mask.setMask("#####-####");
format.setFormatterFactory(new DefaultFormatterFactory(mask));
break;
case 10:
mask.setMask("(##)####-####");
format.setFormatterFactory(new DefaultFormatterFactory(mask));
break;
case 11:
JPopupMenu pop = new JPopupMenu();
JMenuItem comDDD = new JMenuItem("(" + nome.substring(0, 2) + ")" + nome.substring(2, 7) + "-" + nome.substring(7, 11));
comDDD.addActionListener((ActionEvent ae) -> {
try {
mask.setMask("(##)#####-####");
format.setFormatterFactory(new DefaultFormatterFactory(mask));
format.setText(nome);
} catch (ParseException ex) {
}
});
JMenuItem com0800 = new JMenuItem(nome.substring(0, 4) + " " + nome.substring(4, 7) + "-" + nome.substring(7, 11));
com0800.addActionListener((ActionEvent ae) -> {
try {
mask.setMask("#### ###-####");
format.setFormatterFactory(new DefaultFormatterFactory(mask));
format.setText(nome);
} catch (ParseException ex) {
}
});
pop.add(comDDD);
pop.add(com0800);
pop.show(format, format.getX(), format.getY());
break;
default:
break;
}
format.setText(nome);
} catch (Exception asd) {
System.out.println(asd);
}
}
O código abaixo mostra a chamada do método, que ocorre ao sair do foco:
private void jFormattedTextField1FocusLost(java.awt.event.FocusEvent evt) {
mudaMascaraTelefone(jFormattedTextField1);
}
Este código abaixo limpa a mascara quando entra em foco, desta forma ele reseta a mascara mas mantem o antigo numero
private void jFormattedTextField7FocusGained(java.awt.event.FocusEvent evt) {
jFormattedTextField7.setFormatterFactory(null);
}
Importante citar que caso n entre em nenhuma condição, ele gravara normalmente o numero digitado, portando que seja apenas numérico (Importante caso o numero seja do Exterior).
Espero que este código tenha ajudado alguém. Duvidas, comentários e/ou sugestões são bem vindos.