如何将System.out的输出重定向到JavaFx TextArea
我正在尝试创建一个简单的应用程序,允许我将所有System.out重定向到我的应用程序中的JavaFX如何将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
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
是相互矛盾的:请参阅Javaprotected
中的@0009laH注释同一包中的子类和类都可以看到成员。请(包括完整的异常stacktrace)protected
并不意味着您可以从同一个包中的类访问文本区域,而是意味着您可以从继承的类访问文本区域。如果您希望您的成员是包私有的,只需删除protected
关键字。@FXML
和static
是相互矛盾的:请参阅Javaprotected
中的@0009laH注释同一包中的子类和类都可以看到成员。