我已经阅读并实现了Observable / Observer设计模式。但不知怎的,它不起作用。我找不到解决方案。也许我正在传递一些东西。我很高兴并感谢你的建议。代码如下:
可观察:
import java.io.ByteArrayOutputStream;
import java.util.Observable;
public class ObservableOfOutput extends Observable {
private ByteArrayOutputStream baos;
public ObservableOfOutput(ByteArrayOutputStream baos) {
synchronized (this) {
this.baos = baos;
}
setChanged();
notifyObservers();
}
public synchronized ByteArrayOutputStream getBaos() {
return this.baos;
}
}
观察:
import java.util.Observable;
import java.util.Observer;
import javafx.scene.control.TextArea;
public class ObserverOfOutput implements Observer {
private TextArea ta;
public ObserverOfOutput(TextArea ta) {
super();
this.ta = ta;
}
public void observe(Observable o) {
o.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
ObserverOfOutput.this.ta.setText(((ObservableOfOutput) o).getBaos().toString());
}
}
使用它们的类:
// do something usefull
// Change outputs into the custom output stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
System.setOut(new PrintStream(baos));
System.setErr(new PrintStream(baos));
ObservableOfOutput observableBAOS = new ObservableOfOutput(baos);
// text area to print results
TextArea console = new TextArea();
ObserverOfOutput observerTA = new ObserverOfOutput(console);
observerTA.observe(observableBAOS);
// show console
showCustomConsole(console); // shows new window with this TextArea
System.out.println("Starting the tool using following parameters:\n");
System.out.println("Blabla");
System.out.println("Blablabla2");
System.out.println("Tool finished its work.");
只需将console.setText(baos.toString())写在最后,将最后一个输出转发到TextArea即可。但这不是我需要的。我需要这个监听器在TextArea上进行实时输出。该工具运行很长时间并使用System.out / err.println抛出字符串。我想在抛出它们时抓住它们并将它们放入TextArea。
先谢谢。 : - )