Alterar label mediante Runtime.getRuntime().exec("") waitFor()

1 resposta
felipefedel

Olá pessoal. Estou com uma dúvida de como usar o Runtime.getRuntime().exec("") e waitFor() corretamente.

Vou explicar o que quero fazer para então poder explicar o problema.

Preciso fazer uma interface em Java que rode um script em perl quando aperto um botão. Essa parte está OK.
O script em Perl que vou executar demora um bom tempo até terminar a execução então pensei em colocar um label que avise o status da operação. Ex: Enquanto o script está sendo executado aparece uma mensagem “Executando…aguarde.” e depois de realizado todo o processo aparece “Realizado com sucesso…”

Aqui aparece o problema…

No primeiro teste que fiz, eu esqueci a parte do label e apenas uso System.out.println e funciona…quando eu aperto o botao ele escreve “Rodando”…e quando termina escreve “Feito”…ok . Segue o evento do botão no primeiro teste (usando System.out.println):

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
         System.out.println("Rodando...\n");

        try {

            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("perl /home/felipe/for.pl");
            InputStream stdin = proc.getInputStream();
            InputStreamReader isr = new InputStreamReader(stdin);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            System.out.println("<OUTPUT>");
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            System.out.println("</OUTPUT>");
            try {

                int exitVal = proc.waitFor();
                System.out.println("Process exitValue: " + exitVal);
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
System.out.println("Rodou...");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

Como funcionou com o System.out.println, tentei fazer com que as mensagens aparecessem no label. Coloquei o nome “status” no label. Segue o código:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        status.setText("Rodando...");

        try {

            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("perl /home/felipe/for.pl");
            InputStream stdin = proc.getInputStream();
            InputStreamReader isr = new InputStreamReader(stdin);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            System.out.println("<OUTPUT>");
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            System.out.println("</OUTPUT>");
            try {

                int exitVal = proc.waitFor();
                System.out.println("Process exitValue: " + exitVal);
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
           status.setText("Rodou...");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

Desse ultimo jeito não aparece a mensagem “Rodadando…”. Aparece a mensagem “Rodou” direto quando termina a execução.

Porque deu certo com System.out.println e com o status.setText("") não?

Obs: Estou usando o Netbeans 6.5 no Linux

1 Resposta

Jose111

Utilize Swing Worker aqui no GUJ tem topicos explicando como utiliza-lo.

Criado 16 de julho de 2009
Ultima resposta 16 de jul. de 2009
Respostas 1
Participantes 2