Uppercase em jtextfield [resolvido]

20 respostas
D

Galerinha é o seguinte… tenho um jtextfield que pode receber somente letras maiusculas. Só que eu não consigo passar as letras que a pessoa digita para uppercase.
Exemplo:
A pessoa digita a:
então no jtextField tem que aparecer A em maiusculo
e assim sucessivamente… de acordo com o que ele vai digitando vai passando para maiusculo.
alguém ai tem uma solução.

Estou usando esse código, mas num deu certo não:

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

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

e chamo ela assim:

jtextfield.setDocument(new LetraMaiuscula());

só que num dá certo.

20 Respostas

Andre_Rosa

http://www.java-tips.org/java-se-tips/java.awt/limit-a-textfield-to-uppercase.html

D

juniorlinux, num teria uma maneira genérica de fazer isso?
é porque eu tenho vários campos que precisa desse código.

rodrigo.turini

Fera, veja se este exemplo abaixo te ajuda...

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ExemploMaiusculas extends JFrame{
JButton copiar,limpar;
JLabel rotulo1,rotulo2;
JTextField texto1,texto2;

public ExemploMaiusculas(){

super("Exemplo de saídas maiúsculas");
Container tela = getContentPane();
tela.setLayout(null);
rotulo1 = new JLabel("Nome: ");
rotulo2 = new JLabel("Nome: ");
texto1 = new JTextField(20);
texto2 = new JTextField(20);
copiar = new JButton("Copiar");
limpar = new JButton("Limpar");
rotulo1.setBounds(20,30,50,20);
rotulo2.setBounds(20,60,50,20);
texto1.setBounds(60,30,180,20);
texto2.setBounds(60,60,180,20);
copiar.setBounds(20,130,100,20);
limpar.setBounds(180,130,100,20);
copiar.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
texto2.setText(texto1.getText().toUpperCase());}});
limpar.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){
texto1.setText("");
texto2.setText("");
texto1.requestFocus();}});
tela.add(rotulo1);
tela.add(rotulo2);
tela.add(texto1);
tela.add(texto2);
tela.add(copiar);
tela.add(limpar);
setSize(300,200);
setVisible(true);
setLocationRelativeTo(null); }

public static void main(String args[]){
ExemploMaiusculas app = new ExemploMaiusculas();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}

Abçs

Andre_Rosa

Veja bem:

JTextField yourField = new UpperCaseField( 10 );

Andre_Rosa

Veja bem:

JTextField yourField = new UpperCaseField( 10 );
D

rodrigo.turini, não seria bem assim. Vou explicar melhor.
Exemplo

Uma pessoa digita a letra t, em vez de aparecer a letra t em minúsculo ela tem que aparecer em maiúsculo (no jtextfield). Preciso que seja assim, pois estou usando uma expressão regular que verifica se as letras estão todas maiúsculas e se num tiver ele me retorna uma mensagem.

Meramente iluastrativo

Nome
[ ]
a pessoa digita a:

Nome
[A ]
a pessoa digita l:

Nome
[AL ]
a pessoa digita i:

Nome
[ALI ]
a pessoa digita n:

Nome
[ALIN ]
a pessoa digita e:

Nome
[ALINE ]

D

juniorlinux o código do link que você passou num funfo.
Mais valeu

Eric_Yuzo

A classe herdando PlainDocument postada está aparentemente correta.

Está havendo alguma exceção ou ele simplesmente não está convertendo os caracteres?

D

juniorlinux, o outro código
[code]
JTextfield text = new UpperCaseField( 10 );
também não funcionou, ele da um erro:

cannot find symbol

D

Eric Yuzo, ele simplesmente não converte.

rodrigo.turini

David, mas você chegou a rodar o cod que eu passei?
Porque ele faz justamente isso, no 1º TextField ele recebe o texto digitado em letras minúsculas, e mantem.
Enquanto no 2º TextField ele recebe as letras em minúsculas, e converte p/ maiúsculas. (usando o método toUpperCase().)

D

rodrigo.turini, rodei sim, só que o seu código só torna maiúsculo a letra quando clica no botão Copiar

rodrigo.turini

Ah tah, entendi…
Estou de saída, mas se até amanhã não chegarem a uma solução eu tento ajudar.

Abraços e boa sorte.

Eric_Yuzo

Pelo que vi no seu outro tópico, você tem outros Documents para realizar funções diferentes. Quando é feito um setDocument, o que fica valendo é o último Document setado.

Veja se o seu LetraMaiscula não está sendo substituído por outro Document.

D

vlw cara…

D

eric yuzo, muito obrigado, era isso mesmo. é que eu tava chamando o meu document limitaCaracter e o meu document letramaiuscula no mesmo campo, dai ele só aceitava um, como você disse.
Vlw

D

affsss, agora gerou outo erro… O meu campo agora não limita o carater, tipo, se eu uso o document limitacaracter ele não aceita o document letramaiuscula e vice-versa.

Eric_Yuzo

Não pode fazer um Document que converta os caracteres para maiúsculo e limite a quantidade de caracteres?

D

eric yuzo, precisa responder mais não, consegui.
ta ai o código para quem precisar, num sei se é o certo mais esta ai:

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

public class LetraMaiuscula extends PlainDocument {
     private int iMaxLength;
    public LetraMaiuscula(int maxlen) {
         super();
         iMaxLength = maxlen;
     }

    @Override
     public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
        //super.insertString(offset, str.toUpperCase(), attr);
        if (str == null) {
             return;
         }

         if (iMaxLength <= 0)        // aceitara qualquer no. de caracteres
         {
             super.insertString(offset, str, attr);
             return;
         }

         int ilen = (getLength() + str.length());
         if (ilen <= iMaxLength)    // se o comprimento final for menor...
             super.insertString(offset, str.toUpperCase(), attr);   // ...aceita str e passa ela para UpperCase
     }
}

créditos para o Eric Yuzo

dougpts

O problema que vi, foi a sobrecarga que foi feita no método insert. O correto seria sobrecarregar o replace.

Exemplo:

public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setLayout(null);
        frame.setSize(400, 400);

        JPanel panel = new JPanel();
        panel.setLayout(null);

        JTextField field = new JTextField();
        field.setSize(100, 30);
        field.setDocument(new PlainDocument() {
            @Override
            public void replace(int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                if (text != null) {
                    text = text.toUpperCase();
                }
                super.replace(offset, length, text, attrs);
            }
        });
        panel.setSize(400, 400);
        panel.add(field);

        frame.add(panel);
        frame.setVisible(true);
    }

Acho que essa seria a forma mais elegante.

Criado 31 de outubro de 2010
Ultima resposta 13 de jun. de 2014
Respostas 20
Participantes 5