System.out。*的监听器进入TextArea

时间:2015-09-15 09:20:35

标签: java javafx javafx-2 output observable

我已经阅读并实现了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。

先谢谢。 : - )

0 个答案:

没有答案