概要

Loggerのログ出力をJTextAreaに表示するためのOutputStreamStreamHandlerを作成します。

サンプルコード

class TextAreaOutputStream extends OutputStream {
  private final ByteArrayOutputStream buf = new ByteArrayOutputStream();
  private final JTextArea textArea;
  public TextAreaOutputStream(JTextArea textArea) {
    super();
    this.textArea = textArea;
  }
  @Override public void flush() throws IOException {
    textArea.append(buf.toString("UTF-8"));
    buf.reset();
  }
  @Override public void write(int b) throws IOException {
    buf.write(b);
  }
}
view all

解説

  • TextAreaOutputStream
    • ByteArrayOutputStreamを使用して、JTextAreaに一行ずつ書き込みを行う
    • これをSystem.setOut(new PrintStream(new TextAreaOutputStream(textArea), true, "UTF-8"));のように標準出力ストリームに割り当てると、System.out.println(...)などで改行文字が書き込まれたときに、バッファーのflush()が呼び出され、textArea.append(buf.toString("UTF-8"));JTextAreaに文字列が追記される
  • TextAreaHandler
    • ログ出力を上記のTextAreaOutputStreamなどに割り当てるため、StreamHandlerを継承するTextAreaHandlerを作成し、Logger#addHandler(...)で設定
    • StreamHandler#setEncoding(...)でエンコーディングをUTF-8に設定
    • StreamHandler#publish(...)StreamHandler#close(...)をオーバーライド
class TextAreaHandler extends StreamHandler {
  private void configure() {
    setFormatter(new SimpleFormatter());
    try {
      setEncoding("UTF-8");
    } catch (IOException ex) {
      try {
        setEncoding(null);
      } catch (IOException ex2) {
        // doing a setEncoding with null should always work.
        // assert false;
        ex2.printStackTrace();
      }
    }
  }
  public TextAreaHandler(OutputStream os) {
    super();
    configure();
    setOutputStream(os);
  }
  //@see java/util/logging/ConsoleHandler.java
  @Override public void publish(LogRecord record) {
    super.publish(record);
    flush();
  }
  @Override public void close() {
    flush();
  }
}

参考リンク

コメント