我正在尝试使用“启动”和“停止进程”按钮创建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();
}
答案 0 :(得分:1)
以下一行:
while ((line = brCleanUp.readLine ()) != null) {
等待stdout
流的结束。当您等待子进程stdout
结束时,您的程序将无法继续,因此您的事件循环未运行,您将无法再按下任何按钮。
要解决此问题,您需要定期从brCleanUp
读取,同时仍然让GUI事件循环运行。
答案 1 :(得分:1)
作为一般规则,您不希望在Swing事件派发线程上执行任何长时间运行的任务;你会想要从EDT的输入中移出你的阅读。一种可能性是使用SwingWorker