Java 从jTextArea上的shell命令获取结果

Java 从jTextArea上的shell命令获取结果,java,swing,shell,cmd,jtextarea,Java,Swing,Shell,Cmd,Jtextarea,我必须从java swing应用程序执行shell命令windows并获得实时结果: String cmd = jTextField1.getText(); StringBuffer output = new StringBuffer(); Process p; try { p = Runtime.getRuntime().exec(cmd); BufferedReader reader = new BufferedReader(new InputStreamReader(

我必须从java swing应用程序执行shell命令windows并获得实时结果:

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();
}

问题是jTextArea中的写入是在执行完成之后,不像System.out.println那样是实时的

尝试创建一个线程,并使用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()
更改代码如下

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()

尝试创建一个线程并使用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()
更改代码如下

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()

从事件分派线程EDT外部更新swing组件时,应使用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);
        }
    });
} 

从事件分派线程EDT外部更新swing组件时,应使用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);
        }
    });
} 

这是不正确的同步;显示了更好的方法。这是错误同步的;显示了一种更好的方法。