Fazer teclado interronper loop

5 respostas
A

Bom dia!

Estou fazendo um programa e quero que um loop seja interrompido somente quando for pressionada uma determinada tecla( 0, por exemplo). Pesquisei na net, mas nao achei como fazer isto.

Obrigada

5 Respostas

ViniGodoy

Você está usando interface gráfica?
Esse loop roda numa thread separada?

A

ViniGodoy:
Você está usando interface gráfica?
Esse loop roda numa thread separada?

A entrada de dados eh pelo console.
Inicialmente pensei em rodar este loop no main.

ViniGodoy
String letra = "";

//Usamos um scanner para ler do teclado.
Scanner input = new Scanner(System.in);

//Enquanto a letra digitada não for s
while (!letra.equals("s") {
   System.out.println(letra);
   System.out.println("Alguma coisa, ou 's' para sair: ");
   letra = input.readln(); //Lemos do teclado aqui.
}

System.out.println("Fim do programa");
A

Oi

Na verdade eu quero que o loop seja quase infinito. Isto eh, ele so interrompe se for teclado S, senao ele roda o tempo todo. Seria como se o teclado gerasse uma interrupçao que interrompesse o loop.

ViniGodoy

Nesse caso, você deve usar uma outra thread:

import java.util.Scanner;

public class ExemploTecla {
    public static void main(String[] args) {
        // Disparamos o loop em outra thread
        LoopRunnable loopRunnable = null;

        String letra = "";

        // Enquanto a letra digitada não for q
        while (!letra.equals("q")) {
            System.out.println("Pressione q para sair do programa, i para iniciar o loop, p para parar o loop");
            Scanner input = new Scanner(System.in);
            letra = input.nextLine();

            // Se digitou i e não temos um loop em execução
            if (letra.equalsIgnoreCase("i") && loopRunnable == null) {
                // Iniciamos o loop
                loopRunnable = new LoopRunnable();

                Thread loopThread = new Thread(loopRunnable, "Looping thread");
                loopThread.setDaemon(true);
                loopThread.start();
            }

            // Se digitou p, e o loop está rodando.
            if (letra.equalsIgnoreCase("p") && loopRunnable != null) {
                // Usamos o método stop para avisar o runnable controlador
                // do loop que desejamos para-lo.
                loopRunnable.stop();
                loopRunnable = null;
            }
        }
        System.out.println("Fim do programa");
    }
    
    //Essa outra classe é o Runnable que controla a thread do loop.
    private static class LoopRunnable implements Runnable {
        private volatile boolean isStopped = false;

        //Usado para que outra thread sinalize que queremos parar o loop.
        public void stop() {
            isStopped = true;
            System.out.println("Parando o loop...");
        }

        public void run() {
            try {
                //A thread do loop roda até que seja sinalizado para parar
                while (!isStopped) {
                    System.out.println("Looping rodando..." + isStopped);
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                System.out.println("Thread do loop interrompida.");
            }

            System.out.println("Fim do loop");
        }
    }
}
Criado 9 de novembro de 2007
Ultima resposta 9 de nov. de 2007
Respostas 5
Participantes 2