回答編集履歴

2

追記

2018/01/30 06:16

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -41,3 +41,43 @@
41
41
 
42
42
 
43
43
  少なくとも期待しておられる振る舞いをさせるためにはByteArrayOutputStreamの機能がマッチしていないような気はします。
44
+
45
+
46
+
47
+ ---
48
+
49
+ 追記:
50
+
51
+
52
+
53
+ > より適したやり方
54
+
55
+
56
+
57
+ (1) ByteArrayOutputStreamよりはCharArrayWriter
58
+
59
+
60
+
61
+ 文字の入出力をする際には、バイナリーストリームを使うよりは文字ストリームを使う方が自然だと思います。ByteArrayOutputStreamに似たjava.io.CharArrayWriterというクラスがあります。こちらのクラスではbyteではなく文字を扱えます。
62
+
63
+
64
+
65
+ (2) CharArrayWriterとPipiedWriter
66
+
67
+
68
+
69
+ CharArrayWriterは出力した内容がどんどん内部バッファーにたまっていきます。このクラスは「随時出力した文字列を最後に一回だけ全部取り出す」という目的で使うのが普通だと思います。出力側で何かを随時出力しながらそれを入力側で「追記された部分のみ取り出す」方が柔軟な気がします。
70
+
71
+ 質問者さんはJTextArea#setTextを用いておられるので「表示すべき全体のテキストを毎回求めて設定する」という方法論なわけですが、JTextArea#appendを用いると「現在のテキストの末尾へ指定した文字列を追記する」ということもできます。それと併用するならCharArrayWriterよりはPipiedWriter/PipiedReaderの組み合わせのようなものがよいと思います。
72
+
73
+
74
+
75
+ (3) java.io.xxxよりは・・・
76
+
77
+
78
+
79
+ 本来的(?)にはjava.ioにあるストリームの内容をGUIのJTextAreaなどへ「随時反映する」という機能は別スレッドで行った方がよい気がします。GUIのスレッド(swingではEDTスレッドと呼びます)で呼び出し元スレッドがブロックしてしまうようなread/write系の機能を使うのは下手をするとGUIの機能を損ないかねません。例えば出力側がまだ文字列を書き込んでいないタイミングでストリームからreadしようとするとGUI全体がハングなんて事態が起こりかねません。
80
+
81
+
82
+
83
+ ご質問のコードで言えば、マウスイベントでoutへprintlnで出力してますが、そうせずに単にmainAreaへappendする方がより自然な方法だと思います。

1

文章不備訂正

2018/01/30 06:16

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -36,4 +36,8 @@
36
36
 
37
37
  ---
38
38
 
39
- System.inからどのようにして出力しているかや、そもそもこのアプリケーションがどういうものを狙ったものかにより対処法は変わるような気がしますの「どうしたらよい」かはっきり意見をいいにくいです。
39
+ System.inからの入力をどのようにして出力しているかや、そもそもこのアプリケーションがどういうものを狙ったものかにより対処法は変わるような気がします。場合によっては仕組みを変えた方がよいということがあるかも知れません。そため「どうしたらよい」かはっきり意見をいいにくいです。
40
+
41
+
42
+
43
+ 少なくとも期待しておられる振る舞いをさせるためにはByteArrayOutputStreamの機能がマッチしていないような気はします。