【问题标题】:How to redirect output from System.out to JavaFx TextArea如何将 System.out 的输出重定向到 JavaFx TextArea
【发布时间】:2020-10-09 08:02:34
【问题描述】:

我正在尝试创建一个简单的应用程序,它允许我将所有 System.out 重定向到我的应用程序内的 JavaFX TextArea

为此,我从 OutputStream 类创建了一个 CustomOutputStream 类。这是它的代码:

//package name

//imports

public class CustomOutputStream extends OutputStream {
    private TextArea terminal;

    public CustomOutputStream(TextArea terminal) {
        this.terminal = terminal;
    }

    @Override
    public void write(int b) throws IOException {
        terminal.setText(terminal.getText() + String.valueOf((char) b));
    }
}

在我的AppController.java 文件中,我将TextArea 设置为受保护,以便我可以从同一个包中的另一个类访问它:

@FXML
protected static TextArea textArea_terminal;

现在这个AppContoller.java,在按下按钮时调用另一个类的函数(runShell())。此函数 (runShell()) 是调用 Channel 类的另一个函数的函数,我希望将其输出放入 TextArea。因此,为此我以这种方式实现了我的CustomOutputStream

PrintStream printStream = new PrintStream(new CustomOutputStream(AppController.textArea_terminal)) ;
System.setOut(printStream);

channel.setOutputStream(System.out); //channel is an instance of my class whose output I need.

不幸的是,尽管如此,TextArea 和 IDE 终端中都没有输出。当我添加System.out.println("hello") 来测试printStream 时,出现了NullPointerException

我在想要么是我传递TextArea 变量的方式有问题,要么是channel 中我的函数占用的线程有问题。

任何想法为什么会导致这种情况以及如何解决?

【问题讨论】:

  • minimal reproducible example 请(包括完整的异常堆栈跟踪)
  • protected 并不意味着你可以从同一个包中的类访问文本区域,这意味着你可以从继承的类中访问它。如果您希望您的成员成为 package-private,只需删除 protected 关键字即可。
  • @FXMLstatic 是矛盾的:见stackoverflow.com/questions/23105433/…
  • @0009laH 注意 Java 中的 protected 成员对同一包中的子类 类都是可见的。

标签: java javafx system


【解决方案1】:

我知道我的问题具有非常具体的性质,我的问题可能过于宽泛而无法充分传达。

我的目标是从 JSch 库中的 exec 函数的输出中获取 System.err 消息,并将其显示在 JavaFX TextArea 中。因此,我需要从远程服务器获取错误流,而不是本地程序的错误流。

我尝试创建一个 OutputStream 来执行此操作,但它没有解决我的问题。因此,我想出了一个解决方法:

首先,我将 JSch 通道(我在其中运行我的 exec 函数)中的错误写入文件:

File file = new File("tempOut/errorLog.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintStream ps = new PrintStream(fos);
System.setErr(ps);
((ChannelExec) channel).setErrStream(System.err);

然后我读取该文件并在我的 GUI 中显示其内容:

FileReader fileReader = new FileReader(file);    
BufferedReader br = new BufferedReader(fileReader);  //creates a buffering character input stream  
            
String line;
while ((line = br.readLine()) != null)
{ 
    terminalOut = textArea_terminalOut.getText();
    terminalOut = terminalOut + "\n\n" + line;
}

这基本上就是我想出的解决方法。如果有更好的方法,我仍然很感激。

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2016-02-03
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多