posição do cursor em um jTextField

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

MUITO OBRIGADO!!!

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 :confused:

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]