Pessoal tenho um campo Nome do tipo JFormattedTextField, eu instanciei corretamente junto com sua mascara (somente letra e numero), porém quero salvar no banco de dados nomes MENORES que o tamanho da mascara que é de 15 caracteres…
.
.
.
private JFormattedTextField ftfnomeRNA = new JFormattedTextField();
MaskFormatter mf2 = null;
try {
//
// Create a MaskFormatter for accepting phone number, the # symbol accept
// only a number. We can also set the empty value with a place holder
// character.
//
mf2 = new MaskFormatter("AAAAAAAAAAAAAAA");;
} catch (ParseException e) {
e.printStackTrace();
}
ftfnomeRNA.setValue(null);
ftfnomeRNA.setFormatterFactory( new DefaultFormatterFactory( mf2 ) );
.
.
.
ele funciona OK, SE EU PREENCHO QQ NOME DE 15 CARACTERES, mas se eu preencho por exemplo “ABC” (3 caracteres), e vou para o proximo campo ele volta a mostrar o valor inicial que é vazio.
Como eu faco setar o valor do objeto, se o valor for legal for menor que a máscara ?
Na realidade estou quase voltando para JTextField e implementar uma classe customizada usando PlainDocument, estava lendo em vários fóruns muitas reclamações sobre a usabilidade dessa classe (principalmente para o usuário).
Máscaras são utilizadas quando você define um padrão único que deve ser seguido para a inserção de cada palavra. Se você define uma máscara com “AAAA” você está dizendo que tal String deve conter exatamente 4 caractares alfanuméricos. Então se a String informada não estiver neste padrão, o JFormatterTextField a interpreta como inválida e limpa o campo.
Para resolver, você pode criar o seu Document que faça o tratamento que você precisa, que é limitar o número de caracteres digitados (o que não acontece com uma máscara).
[quote=erico_kl]Máscaras são utilizadas quando você define um padrão único que deve ser seguido para a inserção de cada palavra. Se você define uma máscara com “AAAA” você está dizendo que tal String deve conter exatamente 4 caractares alfanuméricos. Então se a String informada não estiver neste padrão, o JFormatterTextField a interpreta como inválida e limpa o campo.
Para resolver, você pode criar o seu Document que faça o tratamento que você precisa, que é limitar o número de caracteres digitados (o que não acontece com uma máscara).[/quote]
Bom, imaginei que seria assim mesmo, não encontrei nada nos fóruns a vida para “burlar” essa regra, vou partir para customizar uma classe estendida da Document então.
Valeu pessoal
Já resolvi meu problema
Criei uma classe extendida da PlainDocument e funcionou direitinho. Alguns trechos eu importei dos tópicos do fórum GUJ que ajudaram bastante (e do blog desse cara, muito bom também http://www.andrels.com )
/**
* Classe filha de PlainDocument, limita o número máximo de caracteres inseridos
* do objeto instanciado da classe JTextField, limita a edição para apenas
* caracteres alfanumericos (a..z,A..Z,0..9).
*
* @param - NENHUM
* @return - NENHUM
*
*/
public class MaxLengthTextDocument extends PlainDocument {
/**
*
*/
static final int asciiZERO = 48;
static final int asciiTEN = 57;
static final int asciiA = 65;
static final int asciiZ = 90;
static final int asciia = 97;
static final int asciiz = 122;
private static final long serialVersionUID = 6705227503690881594L;
//Store maximum characters permitted
private int maxChars;
private boolean CharAllowed( byte[] arrayASCII ) {
boolean lCheckIsOk = true;
for (int i = 0; i < arrayASCII.length; i++) {
if ( !( ( arrayASCII[i] >= asciiZERO && arrayASCII[i] <= asciiTEN) ||
( arrayASCII[i] >= asciiA && arrayASCII[i] <= asciiZ ) ||
( arrayASCII[i] >= asciia && arrayASCII[i] <= asciiz ) ) ) {
JOptionPane.showMessageDialog(null,"Caracteres permitidos são letras e números.","Aviso",
JOptionPane.WARNING_MESSAGE);
lCheckIsOk = false;
}
}
return lCheckIsOk;}
public void setMaxChars(int maxlen) {
maxChars = maxlen;
}
/**
* Le o caracter ou conjunto de caracteres digitados e verifica se
* do objeto instanciado da classe JTextField, limita a edição para apenas
* caracteres alfanumericos (a..z,A..Z,0..9). Overide da funcao InsertString
* da classe PlainDocument
*
* @param - offs
* @param - str
* @param - a
* @return - NENHUM
* */
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
int ilen = (getLength() + str.length());
// calcula o tamanho do campo + texto texto inserido (pode ser 1 caracter ou ctrl-v)
try {
byte[] byteTexto = str.getBytes("US-ASCII");
if ( !CharAllowed( byteTexto ) ) return;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// se não é letra nem número, retorna
if(str != null && ilen < maxChars) {
super.insertString(offs, str, a); // se nova string < tamanho máx, nada a fazer
}
else
{
if (getLength() == maxChars) return; // se nova string exatamente igual a tamanhom máximo nada a fazer
// se for maior, insere a diferenca (max - tam(control-v))
String newStr = str.substring(0, (maxChars - getLength()));
super.insertString(offs, newStr, a);
}
}
}