JTextAreaでドキュメント更新時のCaret移動をテストする
Total: 3403
, Today: 2
, Yesterday: 4
Posted by aterai at
Last-modified:
概要
JTextArea
のドキュメントが更新された時、Caret
のアップデートポリシーによって、その位置がどのように移動するかをテストします。
Screenshot
Advertisement
サンプルコード
((DefaultCaret) ta0.getCaret()).setUpdatePolicy(DefaultCaret.UPDATE_WHEN_ON_EDT);
((DefaultCaret) ta1.getCaret()).setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
((DefaultCaret) ta2.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
View in GitHub: Java, Kotlin解説
- DefaultCaret.UPDATE_WHEN_ON_EDT
- デフォルト
EDT
(イベント・ディスパッチ・スレッド)でドキュメントの変更が行われる場合にのみCaret
位置が更新される- このサンプルでは
On EDT
がチェックされている場合、SwingWorker#process(...)
内でドキュメントが変更される - このため
Caret
が末尾にあるとその位置が移動するので、左と中のJTextArea
でスクロールが発生する
- DefaultCaret.ALWAYS_UPDATE
- ドキュメントの更新が
EDT
で行われるかどうかに関係なくCaret
位置が必ず更新される - このサンプルでは、
On EDT
がチェックされていない場合SwingWorker#doInBackground(...)
内でドキュメントが変更される - このため
Caret
が末尾にあるとその位置が移動するので、このJTextArea
でのみスクロールが発生する
- ドキュメントの更新が
- DefaultCaret.NEVER_UPDATE
- ドキュメントが更新されてもドキュメント内のキャレットの絶対位置は移動しない
- テキストが削除されてドキュメントの長さが現在のキャレット位置よりも短くなる場合は除く
- ドキュメントが更新されてもドキュメント内のキャレットの絶対位置は移動しない
参考リンク
- DefaultCaret (Java Platform SE 8)
- The Event Dispatch Thread (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)