Bloquear Texto no JTextField com ASCII [RESOLVIDO]

5 respostas
gregorioarthur

opá!

Eu lembro quando usava JAVAscript para bloquear textos no input do HTML e no script eu utilizava comparar os caracteres da tabela ASCII… Bom, hoje preciso bloquear o caracter da aspa simples…

porém não faço idéia de como começar, procurei algumas coisas aqui no GUJ e na net, mas nenhum ajudou muito, vi algumas coisas sobre PlainDocument() mas não sei como implementar!!

alguem teria algo como exemplo desta classe ou alguma coisa que pudesse me ajudar nessa implementação??

OBS! JFormattedTextField não vale!

Vlwe :roll:

5 Respostas

karh-el

Quer um campo de texto que aceite apenas o que você quizer que ele aceite. É isso?
Se for basta usar um KeyTyped.
Se tá usando o netbeans, faça o seuinte:
clique com botão direito no jTextField, eventos, key, KeyTyped.
Digite o seguinte:

boolean teclaCerta = false;
        Character ch = e.getKeyChar();
   /* aceita números e ponto (.) , por exemplo 12.36, mas não 12,6 */
        if (Character.isDigit(e.getKeyChar()) || String.valueOf(ch).equals(".")) {
            teclaCerta = true;
        }
        int comprimentoDeCampo = txt.getText().length();
  /* se não for um digito ou já houver 20 caracteres no jTextFied o evento é consumido. Nada acontece */
        if (!teclaCerta || comprimentoDeCampo == 20) {
            e.consume();

A outra forma é criar uma classe que extende KeyListener e por esse código nela. Dai é só instanciar um objeto.

public void ManipulaCampo extends KeyListener{
                  public void KeyTyped(){
                              boolean teclaCerta = false;
                              Character ch = e.getKeyChar();
                        /* aceita números e ponto (.) , por exemplo 12.36, mas não 12,6 */
                              if (Character.isDigit(e.getKeyChar()) || String.valueOf(ch).equals(".")) {
                                     teclaCerta = true;
                               }
                         int comprimentoDeCampo = txt.getText().length();
                            /* se não for um digito ou já houver 20 caracteres no jTextFied o eventoéconsumido. Nada acontece */
                          if (!teclaCerta || comprimentoDeCampo == 20) {
                                e.consume();
                           }
           }

Você instacia um objeto na classe onde está seu campo texto.

ManipulaCampo evento =new ManipulaCampo();
jTextField.addKeyListener(evento);

Pronto!

ViniGodoy

karh-el:
Quer um campo de texto que aceite apenas o que você quizer que ele aceite. É isso?
Se for basta usar um KeyTyped.

Isso, e se ferra se o cara recortar e colar uma aspas, principalmente se for usando o mouse…

O ideal mesmo é realmente implementar um filho de document, que proiba a adição de aspas. Dá uma lida sobre como o document funciona nesse artigo do GUJ:
http://www.guj.com.br/article.show.logic?id=29

karh-el

Não é perfeito, mas resolve.

gregorioarthur

:smiley:

Bom, a do KeyTyped eu já tinha pensado, porém é como o Vini flo, se o cara der um ctrl+v no campo com algo q tenha os caracteres inválidos, ai jah era…

mas blz, vlew pela dica galera, vou testar a do Document e dpois posto o código aqui.

vlew!

gregorioarthur

Caras!

fiz uma implementação caseira e de teste e consegui bloquear oq eu queria, porém quando eu do um CTRL+C e V no campo ele cola os caracteres q bloquiei, aheahuaeuhaeuheauh

agora queria saber se tem como fazer algo pra ele nao fazer isso…

segue o código

public class LockInvalidChars extends PlainDocument{

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

        if (str == null) return;        

        if (str.equals(".") || str.equals("'")) return;
        else
            super.insertString(offset, str, attr);

    }
}

Edit 1

Tirei o else e parou o problema, vou fazer outros testes aqui… quem puder ajudar… eh bem vindo…!

Edit 2

Troquei o equals por contains ai funcionou normal. Segue abaixo a minha implementação, simples mas funciona…

OBS: não reparem no JAVADoc… ahuaehueahueauh

package arth.utils.forms;

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

/**
 * Esta classe realiza o bloqueio de caracteres invalidos no campo JTextField
 * implementando os metodos da classe PlainDocument()
 *
 * Ao se passar um Array de Strings o mesmo realiza uma comparacao e caso haja
 * caracteres invalidos na String a ser inserida ele realiza o bloqueio.
 *
 * @author Arthur Gregorio
 * @version 1.0.0
 * @since Release 1.0.0
 */
public class LockInvalidChars extends PlainDocument{

    private CharSequence chars;

    /**
     * <strong>Construtor</strong>
     * Recebe um CharSequence que serão os caracteres a serem
     * bloqueados.
     *
     * @param lockedChars
     * @see CharSequence
     */
    public LockInvalidChars(CharSequence lockedChars) {
        chars = lockedChars;
    }

    /**
     * <strong>Descricao</strong>
     * Método sobrescrevido da classe PlainDocument(), nesta versão do metodo o
     * mesmo realiza a checagem dos dados a serem inseridos no JComponent em 
     * questao e caso esteja de acordo (caso o caracter nao esteja bloqueado) ele
     * permite que o mesmo seja inserido
     *
     * @param offset indica o deslocamento (a posição) inicial onde o objeto
     * String str deverá ser inserido
     * @param str a String a ser inserida no JComponent
     * @param attr os atributos para o que será inserido
     * @throws BadLocationException um erro caso a insercao seja feita no local
     * errado.
     */
    @Override
    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException{

        boolean teste = false;

        if (str == null) super.insertString(offset, str, attr);

        int length = chars.length();

        for(int i = 0; i < length; i++){
            if (str.contains(""+chars.charAt(i)+"")){
                return;
            }
            else{
                teste = true;
            }
        }

        if(teste == true) super.insertString(offset, str, attr);
    }
}

ai no JComponent, vc faz assim

String locker = ".,*/-";   //aqui uma String com os caracters a serem bloqueados

private JTextField inTeste = new JTextField();

inTeste.setDocument(new LockInvalidChars(locker));

uma solucao simples para quem quer algo simples ou está aprendendo.

Flow vlw! :wink:

Criado 11 de setembro de 2009
Ultima resposta 14 de set. de 2009
Respostas 5
Participantes 3