Duvida: Pular para o próximo campo de texto automaticamente

Olá Galera, boa tarde!!

Preciso de um help - eu quero que no meu sistema, quando o usuário atingir o máximo na caixa de texto, ele ‘pule’ para outra caixa de texto que eu definir - evitando do usuário precisar clicar ou apertar tab.

Estou usando o Swing\NetBeans.

Grato.

1 curtida

Se estiver utilizando o jTextField basta acionar o evento KeyReleased, verificar o tamanho da string e passar o foco para o próximo campo.

Exemplo:

private void jTextFieldExemploKeyReleased(java.awt.event.KeyEvent evt) {                                      
    avancaCampo(jTextFieldExemplo.getText(), 10, jTextFieldSecundario);
}


private void avancaCampo(String text, int limite, jTextField campoFoco) {
    if (text.length() == limite) {  //Quando a String atingir 10 caracteres o foco vai para o outro campo escolhido
        campoFoco.grabFocus();
    }
}

Muito obrigado!

Jonathan, funcionou direitinho, mas agora surgiu um desafio que não estou conseguindo resolver.

Seguinte, alguns textfields podem ter 1 ou 2 letras e ai eu preciso que o limite seja 1 ou 2 - isso vai depender se o usuario digitar 1 ou 2 letras.

Você tem que implementar uma classe que faça esse trabalho pra você utilizando o PlainDocument.

Exemplo:

public class FixedLengthDocument extends PlainDocument {
    private final int iMaxLength;
    
    public FixedLengthDocument(int maxlen) {
        super();
        iMaxLength = maxlen;
    }
    
    @Override
    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
        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, attr); // ...aceita str
        } else {
            if (getLength() == iMaxLength) {
                return; // nada a fazer
            }
            
            String newStr = str.substring(0, (iMaxLength - getLength()));
            super.insertString(offset, newStr, attr);
        }
    }
}

Com a classe implementada basta limitar o campo no construtor da classe.

Exemplo:

jTextField.setDocument(new FixedLengthDocument(2)); //Limitará o campo em 2 caracteres