Swing/TextAreaOutputStream のバックアップの現在との差分(No.13)
- category: swing
folder: TextAreaOutputStream
title: JTextAreaにLoggerのログを出力する
tags: [JTextArea, OutputStream, StreamHandler, Logger]
author: aterai
pubdate: 2015-02-16T00:00:51+09:00
description: Loggerのログ出力をJTextAreaに表示するためのOutputStreamとStreamHandlerを作成します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2015/02/logging-into-jtextarea.html lang: en
概要
Logger
のログ出力をJTextArea
に表示するためのOutputStream
とStreamHandler
を作成します。
Screenshot
Advertisement
サンプルコード
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();
}
// // Java 10:
// @Override public void flush() {
// textArea.append(buffer.toString(StandardCharsets.UTF_8));
// buffer.reset();
// }
#spanadd
#spanend
@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(...)
をオーバーライド -
StreamHandler#getEncoding()
をオーバーライドしてエンコーディングをUTF-8
に設定 -
StreamHandler#publish(...)
、StreamHandler#close(...)
をオーバーライドしてflush()
を実行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(os, new SimpleFormatter()); } public TextAreaHandler(OutputStream os) { super(); configure(); setOutputStream(os); @Override public String getEncoding() { return StandardCharsets.UTF_8.name(); // "UTF-8"; } // @see java/util/logging/ConsoleHandler.java @Override public void publish(LogRecord record) { super.publish(record); flush(); } @Override public void close() { flush(); } }
- ログ出力を上記の
参考リンク
- System.out.println() Print to JFrame | Oracle Community
- External Program Output To JTextArea - Java | Dream.In.Code
- 標準出力を JTextArea に出力する - As I like it.
- Message Console « Java Tips Weblog