UpperCase em JTextField - solução genérica

11 respostas
claupers

Após procurar pela net uma solução para permitir ao usuário inserir apenas letras em maiusculas em JTextFiled (e outros componentes mais), juntei tudo que encontrei e elaborei a solução abaixo:

private void tf_NomeKeyReleased(java.awt.event.KeyEvent evt) {                                    
        JTextField tf = (JTextField) evt.getComponent();
        if (evt.getKeyCode()!=32 & evt.getKeyCode()!=8 & evt.getKeyCode()!=37 & evt.getKeyCode()!=39)
            tf.setText(tf.getText().toUpperCase());
    }

Basta copiar as três últimas linhas do código e cologar no envento KeyReleased do componente.
Não precisa alterar nada, caso o componente seja um JTextField. Se por exemplo for um JTextPane, mude o tipo do objeto na segunda linha.

Cordialmente;

Claudir Pereira dos Santos

11 Respostas

lina

Oi,

Eu utilizaria mascaramento no campo para fazer isso. Nem sempre queremos uma escuta de teclado em nossas aplicações.

Porém, utilizar a tabela ASCII sempre é interessante…

Tchauzin!

claupers

Eu tentei usar o mascaramento, mas tive problemas com a tecla de espaço pois ao colocar no campo o mascaramento para letras maiusculas ele não aceitava o espaço.

Cordialmente;

Claudir

ViniGodoy

E o que você me diz dele recortar um texto com minúsculas e colar no seu JTextField?

ViniGodoy

Além da solução da Lina, o correto é sobrescrever a interface document.

Copie essa classe para seu projeto:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class UpperCaseDocument extends PlainDocument {
    @Override
    public void insertString(int offset, String str, AttributeSet attr) 
    throws BadLocationException {
      super.insertString(offset, str.toUpperCase(), attr);
    }
}
Depois é só fazer:
seuTextField.setDocument(new UpperCaseDocument());

Para um JTextPane, talvez você tenha que fazer algo similar, mas sobrescrevendo a classe HTMLDocument.

lina
ViniGodoy:
Além da solução da Lina, o correto é sobrescrever a interface document. Copie essa classe para seu projeto:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class UpperCaseDocument extends PlainDocument {
    @Override
    public void insertString(int offset, String str, AttributeSet attr) 
    throws BadLocationException {
      super.insertString(offset, str.toUpperCase(), attr);
    }
}
Depois é só fazer:
seuTextField.setDocument(new UpperCaseDocument());

Para um JTextPane, talvez você tenha que fazer algo similar, mas sobrescrevendo a classe HTMLDocument.

Oi,

Simplesmente perfeito =)

Tchauzin!

ambuzr

te juro vini quando conheci esse metodo chorei de emocao pensei q nao era possivel, modifiquei ela pra aceitar apenas letras e numeros, nada de caracteres

criador
ViniGodoy wrote: Além da solução da Lina, o correto é sobrescrever a interface document. Copie essa classe para seu projeto: view plaincopy to clipboardprint?
import javax.swing.text.AttributeSet;   
import javax.swing.text.BadLocationException;   
import javax.swing.text.PlainDocument;   
  
public class UpperCaseDocument extends PlainDocument {   
    @Override   
    public void insertString(int offset, String str, AttributeSet attr)   
    throws BadLocationException {   
      super.insertString(offset, str.toUpperCase(), attr);   
    }   
}  
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class UpperCaseDocument extends PlainDocument {
    @Override
    public void insertString(int offset, String str, AttributeSet attr) 
    throws BadLocationException {
      super.insertString(offset, str.toUpperCase(), attr);
    }
}

Depois é só fazer:
view plaincopy to clipboardprint?
seuTextField.setDocument(new UpperCaseDocument());
seuTextField.setDocument(new UpperCaseDocument());

Para um JTextPane, talvez você tenha que fazer algo similar, mas sobrescrevendo a classe HTMLDocument.

Oi,

Simplesmente perfeito =)

Tchauzin!

Concordo plenamente com a Lina.

Abraço!

lina

Oi,

Isso é pq você não olhou pelos olhos da band. rs (tá foi palha).

O que eu quis dizer é que aqui no guj existem ótimos tutoriais, inclusive esse:

http://www.guj.com.br/article.show.logic?id=29

Ajudando a controlar digitos e valores em um JTextField =)

Tchauzin!

tnaires

O exemplo do ViniGodoy é perfeito para ilustrar que entender como o MVC é aplicado ao Swing é fundamental. Evita muitas gambiarras… :lol:

ViniGodoy

Sim, aqui eu já havia postado outros dois documents “mais populares”:
http://www.guj.com.br/posts/list/107425.java#579803

Como tamanho fixo num JTextField (discaramente copiado do tuto que a Lina passou) e um que só aceita números, também com tamanho fixo.

ambuzr

Oi,

Isso é pq você não olhou pelos olhos da band. rs (tá foi palha).

O que eu quis dizer é que aqui no guj existem ótimos tutoriais, inclusive esse:

http://www.guj.com.br/article.show.logic?id=29

Ajudando a controlar digitos e valores em um JTextField =)

Tchauzin!

Nao voce nao entendeu, ja conhecia essa classe a muito tempo, digo a primeira vez que vi ja ta fazendo um tempinho acho q foi ate o vini que postou nao me lembro realmente muito boa e da pra ter uma nocao do que o java e capaz… vlw

Criado 22 de outubro de 2009
Ultima resposta 28 de out. de 2009
Respostas 11
Participantes 6