Problemas com PlainDocument, inserção ao contrário!

2 respostas
gregorioarthur

Bom dia galera!

Criei uma classe que limita o tanto de digitos de um JTextField e quais podem ser inseridos, porém quando insiro uma-a-um (ex.: 4, depois 5) o mesmo insere normal, aparecendo no Field “45” mas quando faço um CTRL+C e dpois um CTRL+V no mesmo “45” a inserção ocorre ao contrário! ficando “54”…

Preciso de uma ajuda com esse probleminha, já fiz várias mudanças dentre elas mudar a ordem do loop de checagem, porém nada aconteceu!!!

Abaixo segue a minha classe que extende o PlainDocument:

package arth.utils.control;

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

/**
 * Classe que Fixa o tamanho de um JComponent e permite apenas determinados
 * Caracteres para insercao
 *
 * @author Arthur Gregorio
 * @version 1.0.0
 * @since Release 1.0.0
 */
public class FxLgtPmtChs extends PlainDocument implements CharSeqs {

    private int lgt;
    private CharSequence pmt;

    /**
     * Construtor, recebe o tanto de caracteres que podem ser informados e 
     * a charsequence dos caracteres permitidos.
     *
     * @param lenght Quantidade de digitos maximos do campo
     * @param permited Conjunto de caracteres que sao permitidos
     */
    public FxLgtPmtChs(int lenght, CharSequence permited){
        this.lgt = lenght;
        this.pmt = permited;
    }

    /**
     * 
     * @param offset
     * @param str
     * @param attr
     * @throws BadLocationException
     */
    @Override
    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException {

        int length = pmt.length();
        int infLgt = (getLength() + str.length());

        if (str == null || lgt == 0 || pmt == null) {
            return;
        } else if (lgt <= 0){
            super.insertString(offset, str, attr);
            return;
        } else if (infLgt <= lgt){

            for (char ch : str.toCharArray()){

                System.out.println(length);

                for (int i = 0; i < length; i++){

                    if ((""+ch+"").contains(""+pmt.charAt(i)+""))
                        super.insertString(offset, String.valueOf(ch), attr);
                }
            }
        } else {
            if (getLength() == lgt) return;
            String newStr = str.substring(0, (lgt - getLength()));

            for (char ch : newStr.toCharArray()){

                for (int i = 0; i < length; i++){

                    if ((""+ch+"").contains(""+pmt.charAt(i)+""))
                        super.insertString(offset, (""+ch+""), attr);
                }
            }
        }
    }
}

e a interface que ela implementa com os permitidos:

public interface CharSeqs {

    public static final CharSequence NUMBERS_ONLY = "[telefone removido]";
    public static final CharSequence ALPHABET_ONLY = "abcdefghijklmnopqrstuvwxyz" +
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
}

creio que o problema esteja nesta parte

else if (infLgt <= lgt){

            for (char ch : str.toCharArray()){

                System.out.println(length);

                for (int i = 0; i < length; i++){

                    if ((""+ch+"").contains(""+pmt.charAt(i)+""))
                        super.insertString(offset, String.valueOf(ch), attr);
                }
            }
        }

vleu ai quem puder ajudar! :smiley:

2 Respostas

fantomas

É nisso você está certo…é mesmo nesta parte do código que está o “problema”.

Isso ocorre por causa desta linha:

super.insertString(offset, String.valueOf(ch), attr);

A variável offset é sempre 0 (zero), logo, o primeiro caracter é inserido na posicão 0 (zero), na segunta vez o próximo caracter é inserido na posição 0 (zero) novamente e para isso ocorrer o caracter que foi inserido na primeira vez foi deslocado para a primeira posição (posição após a número zero).

flws

gregorioarthur

e a possível solucao seria mudar o offset a cada nova inserçao? tipo 0, 1, 2 … e assim por diante?

Criado 9 de dezembro de 2009
Ultima resposta 9 de dez. de 2009
Respostas 2
Participantes 2