[Resolvido] Quebrar while com um enter

20 respostas
G

Gente,

Queria fazer uma pergunta que deve ser facil, mas num estou conseguindo fazer:

Tenho um laço while, e quero que ele fique executando infinitamente até que alguem aperte ENTER

Alguem pode me dizer como faz?

[]s
Gui

EDIT: Resolvido com Multi Threads

20 Respostas

Don

ta usando swing?

G

não… é assim:

System.out.println(“Pressione enter para sair”);
while(true){

//executa alguns códigos

}

Eu quero dar um enter no console pra parar.

D

Hail

Man basta vc verificar com um KeyListener, ver se getKeyCode() == 13
que é o valor da tecla enter

abraço

D

gui.orioli:
não… é assim:

System.out.println(“Pressione enter para sair”);
while(true){

//executa alguns códigos

}

Eu quero dar um enter no console pra parar.


O que exatamente vc irá executar? Vai ter leitura de dados com o Scanner? Caso tenha ficará dificil a logica que vc quer.
Se nao tente algo como: while(KeyEvent.KEY_PRESSED!=13){ //mas acho que assim ele só deixa de executar o while... deve entrar num loop infinito. =\ Tô sem java aqui senão testava }

D

ops duplo post =x

B

Para sair de um estrutura de repetição, o comando é break;

então

while (condição) {

  faz alguma coisa;

  if (tecla é ENTER)
    break;

}
G

Não, a alguma coisa que eu vou executar é totalmente diferente de qualquer coisa que use o console… vai ficar copiando arquivos e coisas assim…

O que eu quero é que essa rotina seja executada indefinidamente até que seja dado um enter no console. Será que tem como?

o
While(KeyEvent.KEY_PRESSED != 13)
não saiu do while…

D
Bruno Laturner:
Para sair de um estrutura de repetição, o comando é break;

então

while (condição) {

  faz alguma coisa;

  if (tecla é ENTER)
    break;

}
Mas Bruno como eu faria para pegar quando o cara teclou enter? com keyEvent nao vai acabar fazendo o código no if nao servir de nada? tipo:
while(condiçao){
			//Codigos
			if(KeyEvent.KEY_PRESSED==13)
				break;
		}
E com um Scanner por exemplo iria parar o while esperando o usuário digitar algo, assim tendo que obrigatoriamente pressionar enter. Vlw
D

Não, a alguma coisa que eu vou executar é totalmente diferente de qualquer coisa que use o console… vai ficar copiando arquivos e coisas assim…

O que eu quero é que essa rotina seja executada indefinidamente até que seja dado um enter no console. Será que tem como?

o
While(KeyEvent.KEY_PRESSED != 13)
não saiu do while…


Eu bem que achei que iria acontecer isso =\

Alchemist

Pessoal só uma duvida como seria CTRL+S ?

D

O ctrl-s nao sei, mas o alt-s se lembro é 83… Ou a constante VK_S.

G

Isso, com o Scanner, ele vai parar e ficar esperando o cara digitar algo, e pra continuar ele vai ter que digitar algo que não Enter. Eu quero algo que leia o que ele digitar caso ele digite, e se for enter, ele pare.

gomesrod

Uma sugestão:
Criar uma thread que fica esperando o teclado enquanto o código principal executa normalmente.
Quando o usuário pressionar Enter, uma flag é modificada e você pode usar essa condição para sair do loop principal.

new Thread(objetoControleTeclado).start(); while(!objetoControleTeclado.isEnterPressed()) { // código.... }

EDIT: Acabei respondendo sem pensar direito… na verdade ficaria mais simples se o loop principal fosse para a segunda thread, e a thread Main ficasse esperando o teclado

G

gomesrod:
Uma sugestão:
Criar uma thread que fica esperando o teclado enquanto o código principal executa normalmente.
Quando o usuário pressionar Enter, uma flag é modificada e você pode usar essa condição para sair do loop principal.

new Thread(objetoControleTeclado).start(); while(!objetoControleTeclado.isEnterPressed()) { // código.... }

Hmmm… tá, provavelmente funcione… mas, pelo menos eu acho, parece um jeito complicado pra resolver um problema simples, né?

Outro porem que tem que ver é se o enter vai ser nesse mesmo console…

Eu tava pensando se não tinha algo usavel no System.in ou algo assim…

gomesrod

Puxa… como assim?

G

Consegui fazer algo parecido com o que eu queria, com a unica diferença de que eu não sei como ler o Enter, então estou lendo um Caracter… só preciso de ajuda pra ler o enter ao invés:

Scanner scanner = new Scanner(System.in);  
     while(true){

            if(scanner.hasNext())
                if(scanner.next().equals("a"))
                    break;
gomesrod

Para ver se foi pressionado enter você pode usar scanner.hasNextLine().
Agora esse código a meu ver tem um problema… ele vai ficar esperando você digitar alguma coisa e não vai realmente executar o loop enquanto não digitar.

G

gomesrod:
Para ver se foi pressionado enter você pode usar scanner.hasNextLine().
Agora esse código a meu ver tem um problema… ele vai ficar esperando você digitar alguma coisa e não vai realmente executar o loop enquanto não digitar.

É, notei… =/

Talvez só com threads então =/

Acho que então sua idéia de deixar a Thread que verifica o teclado na classe principal seja melhor mesmo…

gomesrod

Depois que vi o tópico fiquei curioso e implementei pra testar. Aqui vai, você vai ver que é bem mais simples do que parece :wink::

public class Interrupcao {
	static class LoopPrincipal implements Runnable {
		private boolean finalizar = false;
		void notificarFinalizacao() {
			finalizar = true;
		}

		public void run() {			
			while (!finalizar) {
				// Este é o loop com o código principal
				// Faça tudo que quiser aqui.
				System.out.println(System.nanoTime());
			}
			System.out.println("Hora de parar");
		}
	}

	public static void main(String[] args) {		
		// Bota a thread pra rodar
		LoopPrincipal task = new LoopPrincipal();
		new Thread(task).start();

		new Scanner(System.in).hasNextLine(); // Espera o enter		
		task.notificarFinalizacao(); // Interrompe a tarefa.
	}
}
G

Real, funcionou mesmo!
Então, quando você falou, estava tentando fazer isso (tinha pensado umas coisas de umas formas mais complicadas, mas blz!) Esse jeito realmente funciona…

Só fiquei curioso se realmente a InputStream e a Scanner não oferecem um jeito de fazer isso…

Criado 6 de agosto de 2009
Ultima resposta 6 de ago. de 2009
Respostas 20
Participantes 6