JTextAreaに標準出力を切り替える方法
こんなコードを書いてみた
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.swing.JTextArea; /** * * @author yusuke_k */ public class TextConsole extends ByteArrayOutputStream { private JTextArea text; public TextConsole(JTextArea text) { this.text = text; } public void write(int b) { super.write(b); this.text.setText(this.toString()); } public void write(byte[] b, int off, int len) { super.write(b, off, len); this.text.setText(this.toString()); } public void writeTo(OutputStream out) throws IOException { super.writeTo(out); this.text.setText(this.toString()); } }
使うときは、クラスをnewするときにコンストラクタの引数で出力したいJTextAreaオブジェクトを指定してあげるだけ。
private TextConsole console; public なんちゃら初期化メソッド() { this.console = new TextConsole(this.txtConsole); // txtConsoleはJTextAreaのインスタンス // set stdout and stderr System.setOut( new PrintStream( <del>new BufferedOutputStream(</del>this.console<del>)</del> ) ); System.setErr( new PrintStream( <del>new BufferedOutputStream(</del>this.console<del>)</del> ) ); }
もっと正当なやり方がありそうだけど、見つからなかった…。
追記:
試行錯誤した後で、サンプルを見つけてしまうのは良くあることで…T^T。
標準出力コンポーネントを作ろう [Javaプログラミング] All About
ところどころ違いますが、やってることは大体同じみたいですね(おそらく、多分、きっと)。
さらに追記:
BufferedOutputStreamをデコレーションしてしまうとバッファリングしてしまうのでこの場合はしないように! > 自分