java-如何在点击按钮时停止进程

时间:2011-05-05 10:17:09

标签: java

我正在尝试使用“启动”和“停止进程”按钮创建GUI。在单击开始按钮时,将启动一个进程,当用户单击停止按钮时,它应该停止正在运行的进程,但是当进程启动时,控制永远不会返回到原始GUI。     任何人都可以有解决方案吗?  代码片段如下: -

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     // TODO add your handling code here:
            try {
      jTextArea1.setText("\nC:\\peach\\peach.bat --debug "+jFormattedTextField4.getText()+"\n\n");
    if(jFormattedTextField4.getText().isEmpty()){
       JOptionPane.showMessageDialog(null, "Browse The Peach  File First");
    }
    else
    {

            String line=new String(jFormattedTextField4.getText());
    OutputStream stdin = null;
    InputStream stderr = null;
    InputStream stdout = null;

    // launch EXE and grab stdin/stdout and stderr
    //process = Runtime.getRuntime ().exec("C:\\peach\\peach.bat --debug "+line);
    stdin = process.getOutputStream ();
    stderr = process.getErrorStream ();
    stdout = process.getInputStream ();
    stdin.close();

    // clean up if any output in stdout
    BufferedReader brCleanUp = new BufferedReader (new InputStreamReader (stdout));
        while ((line = brCleanUp.readLine ()) != null) {
            System.out.println ("[Stdout] " + line);
                            jTextArea1.append("[Stdout]-->"+line+"\n");
        }
    brCleanUp.close();

            // clean up if any output in stderr
    brCleanUp = new BufferedReader (new InputStreamReader (stderr));
        while ((line = brCleanUp.readLine ()) != null) {
        System.out.println ("[Stderr]-->" + line);
                    jTextArea1.append("[Stderr]"+line+"\n");
        }
    brCleanUp.close();

    }

  }
   catch (Exception err) {
  err.printStackTrace();
}

}

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt){
        // TODO在这里添加您的处理代码:

    process.destroy();    

}

2 个答案:

答案 0 :(得分:1)

以下一行:

    while ((line = brCleanUp.readLine ()) != null) {

等待stdout流的结束。当您等待子进程stdout结束时,您的程序将无法继续,因此您的事件循环未运行,您将无法再按下任何按钮。

要解决此问题,您需要定期从brCleanUp读取,同时仍然让GUI事件循环运行。

答案 1 :(得分:1)

作为一般规则,您不希望在Swing事件派发线程上执行任何长时间运行的任务;你会想要从EDT的输入中移出你的阅读。一种可能性是使用SwingWorker