• category: swing folder: ScrollBeyondLastLine title: JTextAreaの最終行を超えてスクロール可能にする tags: [JScrollPane, JTextArea, JViewport] author: aterai pubdate: 2019-08-19T00:02:28+09:00 description: JTextAreaの高さを拡張し、その最終行を超えてスクロール可能になるよう設定します。 image: https://drive.google.com/uc?id=1_1B-E0sbvJ_4AiKUHMQMXYRsmUodk-BB

概要

JTextAreaの高さを拡張し、その最終行を超えてスクロール可能になるよう設定します。

サンプルコード

JTextArea textArea = new JTextArea() {
  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    Container c = SwingUtilities.getAncestorOfClass(JScrollPane.class, this);
    if (c instanceof JScrollPane && isEditable()) {
      Rectangle r = ((JScrollPane) c).getViewportBorderBounds();
      d.height += r.height - getRowHeight() - getInsets().bottom;
    }
    return d;
  }
};
View in GitHub: Java, Kotlin

解説

  • デフォルトではテキストの最終行までがJTextAreaの推奨サイズとなり、その最終行までがスクロール可能領域となる
    • メモ帳やブラウザなどの動作と同じ
  • JTextArea#getPreferredSize()メソッドをオーバーライドし、JViewportの高さからJTextAreaの一行分を除いた高さを拡張し、最終行が表示上の先頭行になるまでスクロール可能に設定
    • 上記のサンプルではJTextAreaが編集可能の場合、最終行を超えてスクロール可能に設定している
    • Visual Studio Codeなどのエディタのデフォルト?
    • IntelliJ IDEAではエディタの設定からShow virtual space at file bottomで変更可能

参考リンク

コメント