概要

SmoothScrollアニメーション有りでJTextAreaの任意の行まで移動します。

スクリーンショット

SmoothScroll.png

サンプルコード

Document doc = textArea.getDocument();
Element root = doc.getDefaultRootElement();
int ln = model.getNumber().intValue();
try {
  Element elem = root.getElement(ln - 1);
  Rectangle dest = textArea.modelToView(elem.getStartOffset());
  Rectangle current = scroll.getViewport().getViewRect();
  new Timer(20, e -> {
    Timer animator = (Timer) e.getSource();
    if (dest.y < current.y && animator.isRunning()) {
      int d = Math.max(1, (current.y - dest.y) / 2);
      current.y = current.y - d;
      textArea.scrollRectToVisible(current);
    } else if (dest.y > current.y && animator.isRunning()) {
      int d = Math.max(1, (dest.y - current.y) / 2);
      current.y = current.y + d;
      textArea.scrollRectToVisible(current);
    } else {
      textArea.setCaretPosition(elem.getStartOffset());
      animator.stop();
    }
  }).start();
} catch (BadLocationException ex) {
  UIManager.getLookAndFeel().provideErrorFeedback(textArea);
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、java.swing.Timerでイベントが発生するとscrollRectToVisible(...)メソッドを使用して目的位置と現在位置の差の半分だけViewRectのスクロールを繰り返すことで行移動アニメーションを行っています。

参考リンク

コメント