控制台提示符到JTextPane

时间:2015-09-07 07:32:29

标签: java

我有问题。需要将process.getErrorStream(),process.getInputStream()和process.getOutputStream()重定向到JTextPane。 进程位于A类,JTextPane位于B类,因此它们之间没有直接连接。为此,我创建了界面。所以,我可以调用方法informListener(String message),它将行附加到JTextPane。但我无法找到任何可以解决我问题的解决方案。有没有好的和简单的解决方案?

感谢。

2 个答案:

答案 0 :(得分:1)

您需要的是几个线程,它们读取get*Stream方法返回的输入流中的数据并附加到文本区域。

类似的东西:

final BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream());
new Thread(new Runnable() {
    String line ;
    while ((line = reader.readLine()) != null) {
        interfaceObject.informListener(line);
    }
}).start();

只需确保使用textPane在EDT中附加SwingUtilities.invokeLater

以下程序有效。 (我在OS X上):

package snippet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ProcessOutput {

    public static void main(String[] args) throws IOException, InterruptedException {
        final Process p = Runtime.getRuntime().exec("ls -lR");

        final BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        new Thread(new Runnable() {
            @Override public void run() {
                try {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        System.out.println(line);
                    }
                } catch (IOException ex) {
                }
            }
        }).start();

        int waitFor = p.waitFor();
        System.out.println(waitFor + " is the return");
    }
}

检查您的命令是否正确构建。可能只是打印出来,看看你是否能够从cmdline执行它。

答案 1 :(得分:0)

它不起作用。 InformaListener调用另一个方法。这是代码:

 HTMLEditorKit kit = new HTMLEditorKit();
 HTMLDocument doc = new HTMLDocument();
 ...
 logTextPane.setEditorKit(kit);
 logTextPane.setDocument(doc);

public void onLogData(final String message) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    kit.insertHTML(doc, doc.getLength(), message, 0, 0, null);
                } catch (BadLocationException ex) {
                    Logger.getLogger(SummaryPanel.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(SummaryPanel.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

    }

这是getErrorStream的代码:

final String exec = "cmd /C start " + batStrPath + "\\upgrade-build.bat";
            final Process p = Runtime.getRuntime().exec(exec);

            final BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        String line ;
                        while ((line = reader.readLine()) != null) {
                            informListener(line);
                        }
                    } catch (IOException ex) {
                        Logger.getLogger(Installer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }).start();

            p.waitFor();