erico_kl 20 de out. de 2012
é porque você está setando o texto do textField 3 vezes a cada keyReleased disparado, e quando você chama o setText, o cursor (caret) vai para o final do texto por padrão…
Implemente a sua solução de um jeito diferente, ao invés de setar o texto 3 vezes e ficar mudando o caretPosition, use o keyTyped e simplesmente ignore quando tais caracteres forem digitados:@Override
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (c == '%' || c == '"' || c == '\'')
e.consume();
}
silasyudi 23 de out. de 2012
Com KeyEvent não controla totalmente, pois o usuário pode dar um CTRL + C e CTRL + V e conseguir entrar com os caracteres inválidos.
O melhor é usar PlainDocument:
@Override
public void insertString ( int offset , String str , AttributeSet attr ) throws BadLocationException {
str = str . replaceAll ( "[%'\" ] ", " " );
super . insertString ( offset , str , attr );
}
erico_kl 23 de out. de 2012
silasyudi:
Com KeyEvent não controla totalmente, pois o usuário pode dar um CTRL + C e CTRL + V e conseguir entrar com os caracteres inválidos.
O melhor é usar PlainDocument:
@Override
public void insertString ( int offset , String str , AttributeSet attr ) throws BadLocationException {
str = str . replaceAll ( "[%'\" ] ", " " );
super . insertString ( offset , str , attr );
}
Realmente, você está certo, a solução com Document personalizado é mais consistente mesmo..
augusto340 25 de out. de 2012
silasyudi, pode me dar um exemplo como utilizar isso que voce falou?
eu tenho um metodo q uso em todas as classes, chamo ele no evento do textfield
pode me ajudar como fazer isso como PlainDocument?
grato
erico_kl 25 de out. de 2012
Crie uma classe que herde PlainDocument e sobrescreva este método que foi postado. Depois adicione no construtor do seu JTextField
augusto340 26 de out. de 2012
augusto340 26 de out. de 2012
erico_kl
nao existe o metodo construtor com parametro de document no text field!
fiz como voce falou
jTFPaciente = new javax.swing.JTextField(new proibirPorcentoEAspas());
porem assim nao aceita, diz que nao existe esse metodo construtor no jTextField
e nao achei mesmo, na classe jTextField soh achei o metodo
public JTextField ( Document doc , String text , int columns ) {
if ( columns < 0 ) {
throw new IllegalArgumentException ( "columns less than zero." ) ;
}
visibility = new DefaultBoundedRangeModel () ;
visibility .addChangeListener ( new ScrollRepainter ()) ;
this .columns = columns ;
if ( doc == null ) {
doc = createDefaultModel () ;
}
setDocument ( doc ) ;
if ( text != null ) {
setText ( text ) ;
}
}
mas nao tem mandando somento o PlainDocument, tentei com esse de cima mas nao acontece nada
erico_kl 26 de out. de 2012
Use o setDocument se a ideia é passar somente o document…
silasyudi 26 de out. de 2012
Resumindo tudo que foi tratado em código:
public class ProibirPorcentagemEAspas extends PlainDocument {
@ Override
public void insertString ( int offset , String str , AttributeSet attr ) throws BadLocationException {
str = str . replaceAll ( "[%' \" ]" , "" );
super . insertString ( offset , str , attr );
}
}
depois:
seuTextField.setDocument(new ProibirPorcentagemEAspas());
Isso vai substituir em tempo de digitação qualquer tentativa de inserir os caracteres inválidos, inclusive tentativas de arrastar com o mouse e CTRL + C e CTRL + V.
erico_kl 26 de out. de 2012
Isso aí.
Se é um caso único também há a opção de fazer via
Anonymous Class
seuTextField . setDocument ( new PlainDocument {
@Override
public void insertString ( int offset , String str , AttributeSet attr ) throws BadLocationException {
super . insertString ( offset , str . replaceAll ( "[%'\" ] ", " " ), attr );
}
} );