我有自己的Java用户界面工具。如果我点击一个按钮,我想启动一个应用程序。在我的工具中,我有一个控制台,我想把。exe的输出(控制台)。为了做到这一点,我这样做了:
Runtime run = Runtime.getRuntime();
StyledDocument doc = txtResult.getStyledDocument();
SimpleAttributeSet keyWord = new SimpleAttributeSet();
StyleConstants.setForeground(keyWord, Color.RED);
try {
Process pp=run.exec(PATHEXE);
BufferedReader in =new BufferedReader(new InputStreamReader(pp.getInputStream()));
BufferedReader inErr =new BufferedReader(new InputStreamReader(pp.getErrorStream()));
String line = null;
String lineErr = null;
while (((line = in.readLine()) != null) ||(lineErr = inErr.readLine()) != null) {
if(line != null)
doc.insertString(doc.getLength(), line+"n", null );
if(lineErr != null)
doc.insertString(doc.getLength(), lineErr+"n", keyWord );
}
int exitVal = pp.waitFor();
System.out.println("Process exitValue: " + exitVal);
btRun.setEnabled(true);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
一切正常,但我仍然有一些问题:
- 我想转移执行。在另一个线程上执行.exe执行期间释放用户界面。
- 在我的工具中读取输出。exe仅在…然后运行更新,我在运行时得到输出?
使用SwingWorker
。它提供了从EDT中删除长时间运行任务的功能,同时更新EDT上的GUI。
运行线程中的内容很容易:
// put up a progress dialog or something here
Runnable backgroundJob = new Runnable() {
public void run() {
final String output = executeJob(); // call your code you provided
SwingUtilities.invokeLater( new Runnable() {
public void run() {
// safely do your updates to the UI here on the Swing Thread
// hide progress dialog here
updateUI( output );
}
});
}
};
Thread backgroundThread = new Thread( backgroundJob );
backgroundThread.start();
如果你不希望你的UI在.exe执行时被阻塞,那么就简单地运行。在子线程中执行。此外,你可以注册一个回调函数到子线程,它可以在执行结束时回调。