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
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.
Hail
Man basta vc verificar com um KeyListener, ver se getKeyCode() == 13
que é o valor da tecla enter
abraço
[quote=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.[/quote]
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
}
Para sair de um estrutura de repetição, o comando é break;
então
[code]while (condição) {
faz alguma coisa;
if (tecla é ENTER)
break;
}[/code]
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…
[quote=Bruno Laturner]Para sair de um estrutura de repetição, o comando é break;
então
[code]while (condição) {
faz alguma coisa;
if (tecla é ENTER)
break;
}[/code][/quote]
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
[quote]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…[/quote]
Eu bem que achei que iria acontecer isso =\
Pessoal só uma duvida como seria CTRL+S ?
O ctrl-s nao sei, mas o alt-s se lembro é 83… Ou a constante VK_S.
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.
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
[quote=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....
}
[/quote]
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…
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;
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.
[quote=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.[/quote]
É, 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…
Depois que vi o tópico fiquei curioso e implementei pra testar. Aqui vai, você vai ver que é bem mais simples do que parece
:
[code]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.
}
}[/code]