Interromper o laço do... while

7 respostas
S

Oi Galera!!!

To quebrando a cabeça e nao to conseguindo resolver o seguinte problema. O codigo abaixo cria uma janela com dois botoes… play e stop. Quando aperta play, inicia um laço q vai imprimir o valor da variavel ate chegar a condição final, q é x<20000 e continua==true. Porem o q quero fazer é q ao pressionar o botao stop, altere o valor da variavel continua para false e interrompa o laço.

import java.applet.AudioClip;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.awt.GridBagLayout;
import java.util.Random;
import javax.swing.JFrame;

import java.awt.*;
import java.awt.event.*;


public class teste  extends JPanel 
   {
        
    /**
     * Creates a new instance of <code>teste/code>.
     */
     boolean continua=true;
     
     JButton playButton, loopButton, stopButton;
     
     
    public teste() {

    	 playButton = new JButton("Play");

    	   playButton.addActionListener(
                		new ActionListener()
                		
                		{   
                			public void actionPerformed(ActionEvent event)  	
                			{ 
                					stopButton.setEnabled(true);
        	  						playButton.setEnabled(false);
        	  				        
        	  				        
        	  						int x=0;
                    // inicio do laço        	 
 							     do{
        	  							     	
        	  	  								System.out.println(x++);
        	  	  								System.out.println(continua);
        	  									}while (x<20000&&continua==true);
        	 
		        	 
        										System.out.println("Play");	
                			         
                			}
                		}
                		
                		);
         
         stopButton = new JButton("Stop");
         
           stopButton.addActionListener(
                		new ActionListener()
                		
                		{   
                			public void actionPerformed(ActionEvent event)  	
                			{ 
                				  stopButton.setEnabled(false);
        	  					  playButton.setEnabled(true);
        	  	  				  continua=false;
        	  	 
        	 
        							System.out.println(continua);
        	  
        							System.out.println("Stop");
        	
                			}
                		}
                		
                		);
         
         
         stopButton.setEnabled(false);


 		     JPanel controlPanel = new JPanel();
             controlPanel.add(playButton);
             controlPanel.add(stopButton);           
       
    	add(controlPanel);
    }

    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        
          WindowListener l = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {System.exit(0);}
        };
        JFrame f = new JFrame("Do... while");
        f.addWindowListener(l);
         f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.getContentPane().add(new teste());
        f.setSize(new Dimension(400,100));
        f.show();
        
    }
}

7 Respostas

C
if(condição){
break;
}else{
continue;
}
S
if (condição p/ parar o laço){
continua=false;
}
L

Seu problema é de thread. Coloca o código do actionPerformed dentro do método run de um objeto que implementa Runnable, ai dentro de actionPerformed passa esse objeto para uma nova Thread e starta ela.

Algo tipo assim:

public void actionPerformed(ActionEvent event) {
  Runnable r = new Runnable() {
    public void run() {
      //sua logica anterior
    }
  };
  new Thread(r).start();
}
S

To tentando fazer e ainda nao to conseguindo… se alguem conseguir fazer no exemplo q dei… favor postar… Abraços

S

Consegui!!! Valeu pelas dicas!!!
To postando o codigo… so q ele demora para encerrar… se alguem tiver alguma ideia…

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;





public class teste extends JPanel //implements Runnable
  //implements ActionListener 
 {

    /**
     * Creates a new instance of <code>tkd</code>.
     */
     boolean continua=true;
     
     JButton playButton, stopButton;
     
     
    public teste() {

    	 playButton = new JButton("Play");

    	   playButton.addActionListener(
                		new ActionListener()
                		
                		{   
                			public void actionPerformed(ActionEvent event)  	
                			{ 
                					stopButton.setEnabled(true);
        	  						playButton.setEnabled(false);
        	  				        continua=true;
        	  				         
        							 Runnable r = new Runnable() { 
										    public void run() { 
											    	int x=0;
        	  							     				do{
        	  							     	
        	  	  												System.out.println(x++);
        	  	  												System.out.println(continua);
        	  													}while (continua==true);
      	
    												
    												} 
  										}; 
  									new Thread(r).start(); 

        	  									System.out.println("Play");	
                			         
                			}
                		}
                		
                		);
         
         stopButton = new JButton("Stop");
         
           stopButton.addActionListener(
                		new ActionListener()
                		
                		{   
                			public void actionPerformed(ActionEvent event)  	
                			{ 
                				  stopButton.setEnabled(false);
        	  					  playButton.setEnabled(true);
        	  	  				  continua=false;
    
    
        	  	
        	  	 					System.out.println("Interrompendo");
    
    
    
        	 		
        							System.out.println(continua);
        	  
        							System.out.println("Stop");
        							

  								    
							} 

        	
                			}
                		
                		
                		);
         
         
         stopButton.setEnabled(false);


 		     JPanel controlPanel = new JPanel();
             controlPanel.add(playButton);
             controlPanel.add(stopButton);           
       
    	add(controlPanel);
    }


    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        
          WindowListener l = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {System.exit(0);}
        };
        JFrame f = new JFrame("Interrompendo laço infinito");
        f.addWindowListener(l);
         f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.getContentPane().add(new teste());
        f.setSize(new Dimension(400,100));
        f.show();
        
    }
}

ate

L

Encerrar você quer dizer quando você aperta o botão stop?! aqui foi rápido pelo que pareceu.

Não postei o código encima do seu antes porque estava (assim como agora), no trabalho, e essa merda bloqueia o tamanho do meu post =/

S

Sim, quando aperta o botao stop, é q aqui no meu demora… segue o laço um bom tempo, até q para… valeu… abraços…

Criado 4 de novembro de 2007
Ultima resposta 7 de nov. de 2007
Respostas 7
Participantes 4