posição do cursor em um jTextField

10 respostas
A

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!

10 Respostas

E

é 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(); }

S

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);

}
E
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..
A

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

E

Crie uma classe que herde PlainDocument e sobrescreva este método que foi postado. Depois adicione no construtor do seu JTextField

A

MUITO OBRIGADO!!!

A

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:

E

Use o setDocument se a ideia é passar somente o document…

S

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.

E

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);
     }

});
Criado 19 de outubro de 2012
Ultima resposta 26 de out. de 2012
Respostas 10
Participantes 3