• category: swing folder: CaretUpdatePolicy title: JTextAreaでドキュメント更新時のCaret移動をテストする tags: [JTextArea, DefaultCaret, JTextComponent, JScrollPane] author: aterai pubdate: 2016-09-19T15:50:56+09:00 description: JTextAreaのドキュメントが更新された時、Caretのアップデートポリシーによって、その位置がどのように移動するかをテストします。 image: https://drive.google.com/uc?id=1lEAsdjscriBkK232QDUjR95IJEIuxvnTQg

概要

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

サンプルコード

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

参考リンク

コメント