【发布时间】: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关键字即可。 -
@FXML和static是矛盾的:见stackoverflow.com/questions/23105433/… -
@0009laH 注意 Java 中的
protected成员对同一包中的子类 和 类都是可见的。