概要

JTextAreaのドキュメントが更新された時、Caretのアップデートポリシーによって、その位置がどのように移動するかをテストします。

スクリーンショット

Swing/CaretUpdatePolicy.png

サンプルコード

((DefaultCaret) ta0.getCaret()).setUpdatePolicy(DefaultCaret.UPDATE_WHEN_ON_EDT); // default
((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
    • ドキュメントが更新されてもドキュメント内のキャレットの絶対位置は移動しない
      • テキストが削除されてドキュメントの長さが現在のキャレット位置よりも短くなる場合は除く

参考リンク

コメント