簡體   English   中英

從jTextArea上的shell命令獲取結果

[英]get Result from shell command on jTextArea

我必須從Java swing應用程序執行shell命令窗口並獲得實時結果:

String cmd = jTextField1.getText();

StringBuffer output = new StringBuffer();

Process p;
try {
    p = Runtime.getRuntime().exec(cmd);

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String line = "";
    while ((line = reader.readLine()) != null) {
        System.out.println("" + line);
        jTextArea1.append(line + "\n");
    }

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

問題在於,像執行System.out.println(..)一樣,在jTextArea中寫入不是實時完成。

從事件調度線程(EDT)外部更新揮桿組件時,應使用SwingWorker或調用SwingUtilities.invokeLater(),如下所示:

while ((line = reader.readLine()) != null) {
    final String appendLine = line + "\n";
    System.out.println("" + line);
    SwingUtilities.invokeLater(new Runnable(){ 
        public void run(){    
            jTextArea1.append(appendLine);
        }
    });
} 

嘗試創建一個線程並使用Thread.sleep()實時更新JTextArea。

創建一個如下的子類

class Work implements Runnable {

        String cmd;

        Work(String c) {
            this.cmd = c;
        }

        @Override
        public void run() {
            Process p;
            try {
                p = Runtime.getRuntime().exec(cmd);

                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

                String line = "";
                while ((line = reader.readLine()) != null) {
                    System.out.println("" + line);
                    Thread.sleep(500);
                    jTextArea1.append(line + "\n");
                }

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

    }

如下更改代碼

String cmd = jTextField1.getText();
StringBuffer output = new StringBuffer();
new Thread(new Work(cmd)).start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM