Identificar quando pressionado Enter

8 respostas
D

Eu sei que existem tópicos falando sobre isso mas eles sempre ou quase sempre tratam do assunto quando é na parte de layolt e eu quero saber como faço para esperar quando pressiono Enter no modo terminal mesmo.

Abaixo segue o código e abaixo dele o que eu gostaria:

package verifica.senha.forte;

import java.awt.event.KeyEvent;
import java.util.Scanner;

/**
 *
 * @author Leandro
 */
public class VerificaSenhaForte {

    private int key;
    private Scanner entrada;
    private String senha;
    private char vetSenha[];
    private char vetAlfabeto[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
        'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    private char vetAlfabetoUpperCase[] = {'A', 'B', 'C', 'D', 'F', 'G', 'H', 'I', 'J', 'K',
        'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
    private char vetCaracteresEspeciais[] = {'ç', '!', '@', '#', '$', '%',
        '¨', '&', '£', '¢', '¬', '&', '*', '(', ')', '-', '_', '+', '=', '§', '{', '[', 'ª', '}',
        ']', 'º', '^', '~', '<', ',', '>', '.', ':', ';', '?', '/', '°', '|', '¹', '²', '³'};
    private char vetNumeros[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'Ç'};

    public VerificaSenhaForte() {

        System.out.println("Digite a senha que deseja testar:");
        entrada = new Scanner(System.in);
        senha = entrada.nextLine();
        
        if (senha.trim().isEmpty() == true || senha.length() < 5) {

            System.out.println("A senha contém menos de 5 caracteres "
                    + "ou está vazia.\n");
        } else {
            OrganizaSenha();


        }


    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public char[] getVetSenha() {
        return vetSenha;
    }

    public void setVetSenha(char[] vetSenha) {
        this.vetSenha = vetSenha;
    }

   

    public void Observacoes() {

        VerificaTeclaPressionada();

    }

    public void OrganizaSenha() {

        System.out.println("\nObservações:\n\n"
                + "   1) Caso a senha possua espaços eles serão"
                + " automaticamente removidos.\n"
                + "   2) Se a senha possuir caracteres não permitidos como"
                + " ' " + "estes caracteres serão removidos.\n"
                + "\nPressione Enter para continuar ou qualquer tecla para sair.\n");
        Observacoes();
         
    }

    public void VerificaTeclaPressionada() {
        key = KeyEvent.KEY_PRESSED;
        if (key == KeyEvent.VK_ENTER) {
            senha.replaceAll("'", "");
            senha.trim();
            vetSenha = new char[senha.toCharArray().length];
            vetSenha = senha.toCharArray();
            VerificaSenha();
        } else {
            System.out.print("não deu\n");
            System.exit(0);
        }

    }

    public void VerificaSenha() {
        int cont = 0;
        String forcaSenha = "";
        alfabeto:
        for (int i = 0; i < vetSenha.length; i++) {

            for (int r = 0; r < vetAlfabeto.length; r++) {
                if (vetSenha[i] == vetAlfabeto[r]) {
                    cont++;
                    break alfabeto;
                }
            }
        }
        alfabetoM:
        for (int i = 0; i < vetSenha.length; i++) {

            for (int r = 0; r < vetAlfabetoUpperCase.length; r++) {
                if (vetSenha[i] == vetAlfabetoUpperCase[r]) {
                    cont++;
                    break alfabetoM;
                }
            }
        }
        numeros:
        for (int i = 0; i < vetSenha.length; i++) {

            for (int s = 0; s < vetNumeros.length; s++) {

                if (vetSenha[i] == vetNumeros[s]) {
                    cont++;
                    break numeros;
                }
            }
        }
        caracEsp:
        for (int i = 0; i < vetSenha.length; i++) {

            for (int e = 0; e < vetCaracteresEspeciais.length; e++) {
                if (vetSenha[i] == vetCaracteresEspeciais[e]) {
                    cont++;
                    break caracEsp;
                }
            }

        }

        if (cont <= 2) {
            forcaSenha = "fraca";
        }

        if (cont == 3) {
            forcaSenha = "média";
        }

        if (cont >= 4) {
            forcaSenha = "forte";
        }
        System.out.println("\nA senha introduzida é: " + senha + "\n"
                + "Força da senha: " + forcaSenha + "\n"
                + "Número de caracteres da senha: " + getSenha().length());
    }

    public static void main(String[] args) {

        VerificaSenhaForte verifica = new VerificaSenhaForte();

    }
}

Gostaria que após exibir a mensagem avisando sobre as possíveis alterações na senha o aplicativo esperasse pela ação do usuário de pressionar Enter ou outra tecla qualquer, assim como acontece em um scanner por exemplo mas o que ocorre é que quando digito a senha, logo após teclar enter para confirmar a entrada do Scanner já é exibido as observações e o programa se encerra... Alguém pode me ajudar a mapear corretamente esta tecla Enter e dizer como fazer o aplicativo esperar até que ela ou outra tecla seja pressionada após exibir as observações?

Deade já muito obrigado a todos ^^'.

8 Respostas

ViniGodoy

Não faz. Pelo console você não tem como monitorar o teclado em Java.

D

Obrigado =D

Mas como fuciona então exatamente uma entrada nextLine por exemplo da classe Scanner?
Porque você pode digitar qualquer coisa mas somente quando pressionar Enter é que o que foi digitado será pego para armazenar na string, como exatamente essa classe sabe que eu apertei Enter e como ela diferencia Enter de qualquer outra tecla?

ViniGodoy

Ela faz isso usando métodos do sistema operacional. Você até consegue fazer o que quer, se recorrer ao C++, JNI e a API do Windows.

Andre_Rosa

Dark_Iori666:
Obrigado =D

Mas como fuciona então exatamente uma entrada nextLine por exemplo da classe Scanner?
Porque você pode digitar qualquer coisa mas somente quando pressionar Enter é que o que foi digitado será pego para armazenar na string, como exatamente essa classe sabe que eu apertei Enter e como ela diferencia Enter de qualquer outra tecla?

O método nextLine() para quando encontra um determinado caractere, que é o ‘\n’. Em C, por exemplo, você pode ignorar o este caractere:

scanf("%[^\n]s",&str);

com o nextLine(), até onde sei, isso não é possível.

ViniGodoy

Em C++ você tem o método cin.get() que retorna um único caractere: http://www.cplusplus.com/reference/iostream/istream/get/
Com ele você poderia fazer a leitura caractere por caractere, até encontrar o \n, ou qualquer outro terminador que você quisesse. E poderia escolher o que imprimir ou não para seu usuário no processo.

Em C, existe uma função de extensão chamada getch(), implementada por boa parte dos compiladores para PC.

Andre_Rosa

ViniGodoy,
mas a função getch() não pertence à conio? Não é uma boa prática, não acha? E também não faz parte da biblioteca padrão…

D

Gente obrigado por tudo. Parece que é complicado demais fazer isto em vista do panorama ao qual eu apresentei o problema. Eu nem sei nada de métodos do sistema operacional.

Pelo que eu li das respostas, isso seria possível de se fazer usando outras linguagens correto?

Fato é que o java não tem algo “pronto” para fazer isso então acho melhor mudar o código mesmo. ^^

Mas obrigado, é legal saber que uma dúvida boba dessas as vezes é mais problemática do que parece enquanto outras que parecem complexas se resolvem com muita facilidade.

ViniGodoy

Andre Rosa:
ViniGodoy,
mas a função getch() não pertence à conio? Não é uma boa prática, não acha? E também não faz parte da biblioteca padrão…

Sim, por isso recomendei primeiro o cin.get() e comentei que a getch() é uma função de extensão, implementada só por alguns compiladores. Se realmente você quiser um código portável, não é uma boa prática.

O getch() não é exclusividade da conio. Ela surgiu por lá, mas já vi outros compiladores implementando somente essa função.

Criado 19 de junho de 2011
Ultima resposta 20 de jun. de 2011
Respostas 8
Participantes 3