私のGUIでCMDの出力を表示します(javaの)
-
21-08-2019 - |
質問
どのように私はCMDプロセスからの出力は私のGUIで表示するようになるかもしれませんか?これは私がプロセスを実行するために使用しているコードです。
try {
String line;
Process p = Runtime.getRuntime().exec("cmd /c \"e:\\folder\\someCommands.cmd\"");
BufferedReader input =
new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
私はこれをやってみました。
jLabel1.setText(line);
...しかし、プロセスの実行中にGUIが完全にロックされているので、何も非常に有用ではありません非常に最後まで更新しません。それ以外はCMDが正常に動作します。私はリアルタイムで出力を表示します。
解決
あなたは、ラベルのテキストを設定した後()を再描画しましたか?
とにかく、あなたは一般的にGUIのイベントスレッドに長い操作を実行することを躊躇する必要があります。 SwingWorker
の代わりに使用して調べてください。
他のヒント
あなたは、そのプロセスを実行する別のスレッドを起動する必要があります。あなたはそれを実行するために使用しているコードは、あなたがこのようなものを使用する必要があり、あるとして主にだけスレッドの(またはRunnable
の)run()
メソッドに挿入することができますが、JLabelのテキストを設定します:
...
while ((line = input.readLine()) != null) {
SwingUtilities.invokeLater(new SetTextRunnable(jLabel1, line));
}
...
class SetTextRunnable implements Runnable {
private String line;
private JLabel jLabel1
public SetTextRunnable(JLabel jLabel1, String line) {
this.jLabel1 = jLabel1;
this.line = line;
}
public void run() {
jLabel1.setText(line);
}
}
の編集の:ちょうど何かに気づいた:それは(それは、Javaのバージョンに存在する場合)あなたのための別のオプションですので、どうやらクラスSwingWorker
は、この種のもののために設計されました。
の編集のにEDIT:私のように愚かな、私は気付かなかったSwingWorker
は既に別の答えで述べた。
他の人がこれをマルチスレッド化について言っているものに加えて - あなたはまた、子プロセスのエラーストリームを読みたいと思うでしょう。私はあなたがプロセスのエラーストリームを排出していない場合は(いくつかの例では)それがハングアップする可能性がありますと信じています。