Problemas com PlainDocument sobre-escrevendo os valores

3 respostas
jonathanctrl

Boa tarde.
Estou desenvolvendo uma tela onde tenho um JTextField que deverá receber sempre valores UpperCase. Procurando na net e aqui mesmo no fórum acabei criando uma classe derivada da PlainDocument tratando isto no insertString, e funcionou.
O problema é que sempre que vou editar o valor do meu JTextField ele vai sobre-escrevendo a string ao invés de ir inserindo no meio da string os valores que eu vou digitando. Exemplo: Tenho o valor "João da Silva" no meu campo, e quero adicionar o nome "Pedro" logo após o "João" e antes do "da Silva", porém quando coloco o cursor do teclado na posição que desejo e começo a digitar ele sobre-escreve a string ficando "João Pedrolva" ao invés de "João Pedro da Silva". Espero que tenha dado para entender.
Alguém sabe como resolver isso? Procurei muito e tentei várias formas mas não consegui resolver.

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

public class UpperCaseField extends JTextField {

	private static final long serialVersionUID = 1L;

	public UpperCaseField() {
		super();
	}

	protected Document createDefaultModel() {
        return new UpperCaseDocument();
    }

    static class UpperCaseDocument extends PlainDocument {

		private static final long serialVersionUID = 1L;
		
		@Override 
		public void insertString(int offs, String str, AttributeSet a) 
            throws BadLocationException {

            if (str == null) {
                return;
            }
            char[] upper = str.toCharArray();
            for (int i = 0; i < upper.length; i++) {
                upper[i] = Character.toUpperCase(upper[i]);
            }
            super.insertString(offs, new String(upper), a);
        }
    }
}

Muito obrigado pela atenção.

3 Respostas

gabrielemidio

Tenta desse jeito

public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if (str == null) { return; } super.insertString(offs, str.toUpperCase(),a); }

Agora eu não sei se esse código serve para algo em seu projeto

char[] upper = str.toCharArray(); for (int i = 0; i < upper.length; i++) { upper[i] = Character.toUpperCase(upper[i]); }

abraços.

jonathanctrl

Obrigado pela resposta. Eu tentei da forma que falou, mas meu problema persiste. Ele continua funcionando da mesma maneira passando as coisas para UpperCase, mas continua sobre-escrevendo os textos, que é o que estou tentando arrumar agora…

gabrielemidio

Isso pode te ajudar.

http://www.guj.com.br/java/257224-resolvido-aceitar-apenas-letras-maiusculas-no-jtextfield

Criado 18 de janeiro de 2013
Ultima resposta 18 de jan. de 2013
Respostas 3
Participantes 2