Dúvida! Loop While travando JButton

6 respostas
Z

Bom dia

Antes de postar tentei localizar alguma dúvida parecida. Encontrei algumas coisas parecidas, ate tentei realizar os procedimentos descritos pelos colegas porém sem sucesso.

Minha dúvida é a seguinte.

Criei um pequeno aplicativo que com um loop infinito para executar arquivo .bat, porém quando clico no botão INICIAR, este fica pressionado e trava o aplciativo, o BAT executa como eu planejei. Tentei usar Threads mas não obtive sucesso, se alguém puder me ajudar fico agradecido.

public class Tela extends Thread{
	
	private JButton btInicia = new JButton("INICIAR");
	private JButton btPara = new  JButton("PARAR");
	
	private JLabel jlTexto = new JLabel("SISTEMA EM STANDBY");
	
	private JPanel painel1 = new JPanel(new BorderLayout());
	
	private JFrame tela = new JFrame("Vigilante1.0");
	
	public Tela(){
		btInicia.addActionListener(
				new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e) {
						jlTexto.setText("SISTEMA ATIVO");
						try{
							while (0==0){
								Runtime.getRuntime().exec("c://teste.bat");
								Thread.sleep(20000);
							}
						}catch (Exception e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						
					}
				});
		
		painel1.add(btInicia, BorderLayout.SOUTH);
		painel1.add(btPara);
		painel1.add(jlTexto, BorderLayout.NORTH);

		tela.add(painel1);
		
		tela.setSize(200, 200);
		tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		tela.setVisible(true);
	}

6 Respostas

Marlon_Meneses

use swingworker

M

como não obteve sucesso ? rsrs

public void actionPerformed(ActionEvent e) {    
			Thread thread = new Thread(){  
				public void run() {  


					jlTexto.setText("SISTEMA ATIVO");    
					try{    
						while (0==0){    
							Runtime.getRuntime().exec("c://teste.bat");    
							Thread.sleep(20000);    
						}    
					}catch (Exception e1) {    
						// TODO Auto-generated catch block    
						e1.printStackTrace();    
					}   


				}  
			};  
		}

while(0==0) ? Pq não usou o true ?

Z

Bom dia magostta.

Eu tentei com while (true) mas deu na mesma, tentei outras variações tmb não funcionou hehehe ate uma vela de 7 dias já acendi. hehehe

Obrigado pela ajuda FUNCIONOU, porém o arquivo BAT não foi executado…agora acho que é so uma questão de ajuste

gaulix

Acredito que você está fazendo errado a Thread, você está criando a tela como uma Thread, tudo bem, só que é uma única Thread pra tela toda, tens que criar uma específica pra ação do botão, tipo assim:

public void actionPerformed(ActionEvent e) {  
                        jlTexto.setText("SISTEMA ATIVO");  

                          Thread acao = new Thread(new Runnable(
                                public void run(){
                                      try{
                                             while (0==0){  
                                                    Runtime.getRuntime().exec("c://teste.bat");  
                                                    Thread.sleep(20000);  
                                             }
                                      }catch(Exception e1) {  
                                            // TODO Auto-generated catch block  
                                            e1.printStackTrace();  
                                       }  
                                 }));  ...
                                 acao.start();

Não sei se o código tá todo certo, não pude testar e escrevi direto aqui...
Podes também criar uma classe que implementa a classe Runnable, e criar tua Thread passando essa classe como parâmetro, assim:

Thread acao = new Thread(new classeQueImplementaRunnable());

Gurus do java, se eu estiver falando besteira, me corrijam!

Z

Vou testar gaulix

Obrigado

Z

Funcionou perfeitamente com o SwingWorker que o colega Marlon Meneses indicou.

public class TesteSwing extends SwingWorker<Void, Void> {
	
	public boolean controle = true; 
	
	@Override  
    protected Void doInBackground() throws Exception {  
		 try{      
             while (controle){      
                 Runtime.getRuntime().exec("c:\\teste.bat");      
                 Thread.sleep(20000);
             }      
         }catch (Exception e1) {      
        	 JOptionPane.showMessageDialog(null, "SISTEMA PARADO");     
             e1.printStackTrace();      
         }     
        return null;  
    }  

    @Override  
    protected void done() {  
    }  

}

Grato!! :D

Criado 26 de outubro de 2012
Ultima resposta 29 de out. de 2012
Respostas 6
Participantes 4