ActionListener para cancelar um loop "while", como proceder?

Quero fazer um programa que faz um Loop e dentro dele, queria que tivesse uma verificação se o metodo ActionListener foi utilizado, se sim, cancele o Loop

Exemplo:

Quando clicar qualquer tecla ele muda a variável continuar para false e anule o while

Hm… Para tal você deve setar uma FLAG no método actionPerformed próprio não?

Faça o seguinte, no método que verifica se foi clicado, crie uma Thread que faça isso - verifique - e no método actionPerformed sete uma flag - boolean - que sirva como objeto de verificação.

A Thread vai ficar checando - com while e, opcionalmente, Thread.sleep() - se a flag em actionPerformed mudou, aí é só configurar a ação/evento que desejas.

1 curtida

Crie uma Thread para fazer esse método demorado… e no listener você seta esse boolean que você quer… Você tem que usar a Thread porque enquanto ele fica calculando seu programa não permite ler o listener… A thread é um trabalho paralelo a execução do seu programa. Acesse o links abaixo:

Como criar uma Thread:

Como parar uma Thread:

2 curtidas

Está dando certo ^-^
Eu esotu tentando fazer com que um JButton e uma telcla do teclado altere a variável para o oposto (se estiver false, fica true) que ela está, só falta isso…

Código:

Seu código tem um pequeno bug. Quando os botões forem clicados de novo - para desligar - a Thread que será interrompida não será a mesma que está em processamento, já que são objetos anônimos e, portanto, diferentes.

Para contornar isso, ao invés de usar new Thread você faria um objeto Thread e implementaria sua função, para depois no método loop() chamá-lo com um “nomeDaThread.start()” já que seria o mesmo objeto independentemente da vez em que foi chamado.

1 curtida

Crie um boolean static, sete a principio como false dentro do loop e
no actionPerformed() acione como true.

Algo assim:

package testes;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Psiu extends JFrame implements ActionListener {
    JButton botao;
    JFrame janela;
    static boolean para = false;
    static int num = 0; 
    
    public Psiu() {
      botao = new JButton("Dar psiu para a gatinha");  
      botao.addActionListener(this);
      janela = new JFrame();
      janela.add(botao);
      janela.setSize(300,500);
      janela.setVisible(true);
      
        
    }
    
    public void loop () {
        if (para == false) {
            while(num < 10) {
                System.out.println("Sou linda. E estou caminhando pela rua: "+num);
            
       
                   }
            }}
    @Override
    public void actionPerformed(ActionEvent e) {
        para = true;
        num  = 10;
        System.out.println("Psiu, passa seu telefone");
        System.out.println(para);
        loop(); //  vai la de novo, só que dessa vez nao vai ter loop
                 //voce pode criar um novo botão de continue, apenas sete os valores
    }
    
    public static void main(String[] args) {
        new Psiu().loop();

        
        if (Psiu.para == true) {
            System.out.println("Claro!");
        }
    }
    
}

2 curtidas

Mas quando eu clicar no botão ele desliga e liga a Thread?

Por favor, pode me enviar o código?

Splayer tente sem usar Thread, do jeito que fiz.
Se vc ainda não sabe usar Thread, melhor do jeito que fiz, so uma dica :slight_smile:
A Thread vai complicar tua logica… so acho, ate mais!!
Pelo menos não por enquanto!!

Fiz esse exemplo em alguns minutos…Pensei em usar outras possibilidades, mas coloquei so a parte basica:
Fiz a outra parte assim:
Como um numero aleatorio, para definir quais as chances que vc tem de uma garota linda te dar “bom dia”, “oi”, ou alem disso “Ela abrir conversa”, de 0 a 10, sendo essas chances, a mesma ou outras garotas diferentes. O loop estaria infinito, pois você estaria num lugar movimentado, e você seria como alguem que foi procurar realmente isso (uma garota). Neste caso, seria otimo um metodo que fique executando enquanto o programa estiver rodando, ou quando se permitir isso, com opções/menu. Você clica em listar garotas, e tem-se uma lista de 1 a 1000 para você escolher, quem irá fazer a aleatoriedade seria o Random.

No caso, voce teria uma lista (um loop infinito de possibilidades para a noite), você só precisaria dizer algumas palavras. Cada uma delas, teria um, vamos dizer ID, e uma resposta diferente para a sua ‘cantada’.

Bom, fiz aqui, só para descontrair, pois é sexta, e nem sair hoje…Então, imaginação vai longe kkk
Pense no que disse Ada Lovelace sobre máquina analítica, há alguns anos atrás. Hoje as possibilidades continuam as mesmas, afinal de contas;

1 curtida

Faz teu botao parar loop primeiro, jovem!! :slight_smile:

Eu quero fazer que o botão pare e inicie o Loop

Splayer:

Quero fazer um programa que faz um Loop e dentro dele, queria que tivesse uma verificação se o metodo ActionListener foi utilizado, se sim, cancele o Loop

Foi o que tinha entendido: :frowning:

Vai tentando, pegue esse exemplo que fiz, veja o comentario que fiz, onde você pode criar outro actionPerformed(), para o botão iniciar loop novamente.

Você cria um botao para iniciar, dependendo da logica sendo false, e para parar sendo true. Pode até fazer com que o loop continue de onde parou: Mas é bem melhor você pensar em como fazer isso. Passe algumas horas tentando, ou dias. Como eu já fiz com pascal, o esforço vale a pena ! :slight_smile:

1 curtida

Me expressei mal, desculpe
Estou querendo fazer com que um botao possa desligar e ligar o looping

https://paste.ee/p/MR6Eq

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Main extends JFrame implements ActionListener {    
	boolean iniciado = false;    
	JButton jb = new JButton("Iniciar");
	
	public Main() { 
		setVisible(true);        
		setSize(610, 200);        
		setLocationRelativeTo(null);        
		setDefaultCloseOperation(EXIT_ON_CLOSE);        
		setResizable(false);        
		setLayout(null);        
		jb.setBounds(240, 90, 120, 30);        
		add(jb);        
		jb.addActionListener(this);        
		jb.addKeyListener(new KeyAdapter() {            
			public void keyPressed(java.awt.event.KeyEvent e) {                
				if (e.getKeyCode() == java.awt.event.KeyEvent.VK_SCROLL_LOCK) {                    
					Verificar();                
				}            
			};        
		});     
	}    

	public void Verificar() {        
		if (iniciado) {            
			jb.setText("Inciado");           
			loop();           
		} else {          
			jb.setText("Cancelado");      
		}  
	}    
	
	public void loop() {   
		new Thread() {     
			public void run() {  
				while (iniciado) {        
					System.out.println("Looping");   
					try {
						Thread.sleep(1000 * 3);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println("Terminado!");
				javax.swing.JOptionPane.showMessageDialog(null, "Encerrado! BIIIIRRRLL");
			}       
		}.start();
	}   
	
	public static void main(String[] args) {   
		new Main();    
	}    
	
	public void actionPerformed(ActionEvent e) {
		this.iniciado = !this.iniciado;
		Verificar();    
	}
	
}

Aqui está o código, interprete-o e veja o resultado. Se tiver alguma dúvida na lógica é só perguntar.

1 curtida

Funcionou obrigado ^-^
BBIIRRRRRLLLLLL

2 curtidas