如何将System.out的输出重定向到JavaFx TextArea

如何将System.out的输出重定向到JavaFx TextArea,java,javafx,system,Java,Javafx,System,我正在尝试创建一个简单的应用程序,允许我将所有System.out重定向到我的应用程序中的JavaFXTextArea 为此,我从OutputStream类创建了一个CustomOutputStream类。下面是它的代码: //package name //imports public class CustomOutputStream extends OutputStream { private TextArea terminal; public CustomOutputS

我正在尝试创建一个简单的应用程序,允许我将所有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()
)是调用
频道
类的另一个函数的函数,我希望将其输出放入
文本区域
。因此,我通过以下方式实现了我的
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
变量的方式有问题,或者线程被
通道中的函数占用有问题


我知道我的问题是一个非常具体的问题,我的问题可能过于宽泛,无法充分表达这一点

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

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

首先,我将错误从JSch通道(我在其中运行exec function)写入一个文件:

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

这基本上就是我为此想出的解决办法。如果有更好的方法,我还是会很感激的。

我知道我的问题是一个非常具体的问题,我的问题可能太广泛了,无法充分表达这一点

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

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

首先,我将错误从JSch通道(我在其中运行exec function)写入一个文件:

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

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

请(包括完整的异常堆栈跟踪)
受保护
并不意味着您可以从同一个包中的类访问文本区域,而是意味着您可以从继承的类访问它。如果您希望您的成员是包私有的,只需删除
protected
关键字。
@FXML
static
是相互矛盾的:请参阅Java
protected
中的@0009laH注释同一包中的子类和类都可以看到成员。请(包括完整的异常stacktrace)
protected
并不意味着您可以从同一个包中的类访问文本区域,而是意味着您可以从继承的类访问文本区域。如果您希望您的成员是包私有的,只需删除
protected
关键字。
@FXML
static
是相互矛盾的:请参阅Java
protected
中的@0009laH注释同一包中的子类和类都可以看到成员。