概要

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

スクリーンショット

TextAreaOutputStream.png

サンプルコード

class TextAreaOutputStream extends OutputStream {
  private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
  private final JTextArea textArea;

  protected TextAreaOutputStream(JTextArea textArea) {
    super();
    this.textArea = textArea;
  }

  @Override public void flush() throws IOException {
    textArea.append(buffer.toString("UTF-8"));
    buffer.reset();
  }

  @Override public void write(int b) {
    buffer.write(b);
  }

  @Override public void write(byte[] b, int off, int len) {
    buffer.write(b, off, len);
  }
}
View in GitHub: Java, Kotlin

解説

  • 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();
        }
      }
      

参考リンク

コメント