ola pessoal, tenho o seguinte problema…
tenho um jTextField e no evento KeyReleased (disparado ao pressionar uma tecla) tenho o seguinte codigo:
jTextField .setText(jTextField .getText().replace("%", ""));
jTextField .setText(jTextField .getText().replace("'", ""));
jTextField .setText(jTextField .getText().replace("\"", ""));
beleza, agora ele nao aceita ’ " e %
agora vem o problema… Quando estou digitando nesse jTextField
o cursor fica preso no final do texto. Por exemplo:
se tenho escrito “JOAO CARLOS”, e quero voltar o cursor no JOAO para apagar e deixar o CARLOS, não vai
o cursor volta para o final do texto!
Alguem sabe solucionar esse problema? tentei de varias maneiras e nao consigo…
Grato!
é 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();
}
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:
[code]@Override
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
str = str.replaceAll("[%'\"]", "");
super.insertString(offset, str, attr);
}[/code]
[quote=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:
[code]@Override
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
str = str.replaceAll("[%'\"]", "");
super.insertString(offset, str, attr);
}[/code][/quote]
Realmente, você está certo, a solução com Document personalizado é mais consistente mesmo…
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
Crie uma classe que herde PlainDocument e sobrescreva este método que foi postado. Depois adicione no construtor do seu JTextField
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 
Use o setDocument se a ideia é passar somente o document…
Resumindo tudo que foi tratado em código:
[code]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);
}
}[/code]
depois:
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.
Isso aí.
Se é um caso único também há a opção de fazer via Anonymous Class
[code]seuTextField.setDocument(new PlainDocument {
@Override
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
super.insertString(offset, str.replaceAll("[%'\"]", ""), attr);
}
});[/code]