Postei este tópico no avançados pelo seguinte: Já abri vários tópicos sobre este problema, em diversos foruns e até então ninguém conseguiu descobrir uma solução, veja:
Estou trocando meus JTextFields por JFormattedTextField, para implementar validações nos campos de texto ; Aí que começa o problema:
tenho um campo que entra informações de nome do usuario (Antigo JTextfield, agora JFormattedTextField), Queria colocar restrições para que aceite somente caracteres válidos, o que fiz:
Coloque o maskformatter(“UUUUUUUU”) //para resumir 20"U"s, conforme tamanho do meu campo na tabela.
Acontece que funciona perfeitamente se os 20 digitos forem preenchidos, do contrário os caracteres são perdidos; O seja, se o usuario digitar um nome que contenha 20 letras, funciona normal, mas se o nome tiver menos de 20, por exemplo 2,5,10,…letras (<20 letras) some os caracteres quando muda de campo…!!!
Alguém sabe o que deve ser feito?
Agradeço a todos,
Tome cuidado com posts
:arrow: Genêro SOCORRO, HELP e derivados, pois dá desconforto para ler e ignoram o tópico.
:arrow: Post com letra maiuscula tem a impressão que está GRITANDO.
coloquei o metodo setFocusLostBehavior() e a principio os caracteres pararam de sumir ao mudar de campo, mas ainda tem um problema: Nao consigo fazer com que , ao consultar a tabela a informação seja exibida neste campo…!
Quando utilizo o System.out.println, ele exibe a informação, porem quando utilizo o “setText” ou “setValue” para exibir esta informação contida na string que recebeu a informação da tabela, no campo ele nao aparece.
A proposito, o que faz este método setFocusLostBehavior(JFormattedTextField.COMMIT) ? Devo instanciá-lo somente na criação do objeto, ou sempre quando houver uma inserção na tabela?
Valeu pessoal…
PS: O amigo tem razão, nao deveria ter colocado “SOCORRO” e ainda mais em maiúsculo…desculpe-me!
Ai tu implementa as funções de inserção, remoção e replace do filtro.
Eu sei que eh mais complicado, mas eh o jeito. (passei alguns dias investigando isso).
Pra não te deixar totalmente na mão, vou mandar um exemplo de filter (eh provavel que eu nao olhe mais esse topico, cai aqui sem querer e resolvi ajudar )
package com.zipstudio.siaps.filters;
import java.awt.Toolkit;
import java.util.regex.Pattern;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class NameDocumentFilter extends DocumentFilter {
public NameDocumentFilter() {
}
public void insertString(FilterBypass fb, int offs,
String str, AttributeSet a)
throws BadLocationException {
if (str == null || str.equals("") || str.equals(" ")){
fb.insertString(offs, str, a);
} else if (Pattern.compile("([a-zA-Z]+ ?)*").matcher(str).matches() ){
fb.insertString(offs, str.toUpperCase(), a);
} else {
Toolkit.getDefaultToolkit().beep();
System.out.println("Filter not entered: "+str);
}
}
public void replace(FilterBypass fb, int offs,
int length,
String str, AttributeSet a)
throws BadLocationException {
if (str == null || str.equals("") || str.equals(" ")){
fb.replace(offs, length, str, a);
} else if (Pattern.compile("([a-zA-Z]+ ?)*").matcher(str).matches()){
fb.replace(offs, length, str.toUpperCase(), a);
} else {
Toolkit.getDefaultToolkit().beep();
System.out.println("Filter not replaced: "+str);
}
}
}
Estava fazendo uns testes aqui com a classe MaskFormater e percebi o seguinte:
o método setValidCharacters() possui uma validação de caracter a caracter, mas não valida o espaço, ou seja, impossível utilização com espaço neste método;
já com o método setInvalidCharacters() é possível colocar todos os caracteres indesejados e ainda funciona o espaço no JFormattedTextField. No método setMask() é necessário colocar * no lugar de #, significando que pode ter como entrada qualquer coisa. Exemplo:
[code]private static final String ALFACARACTERS = “abcdefghijklmnopqrstuvxwyzzABCDEFGHIJKLMNOPQRSTUVXWYZ”;
private static final String PONTUACAO = “’!@#$%¨&*()_+¹²³£¢¬§=`´{[ª^~}]º<,>.:;?/|\”-çÇ";