• title: JTextAreaでSmoothScrollによる行移動 tags: [JScrollPane, JViewport, Animation, JTextArea] author: aterai pubdate: 2007-08-13T13:01:23+09:00 description: SmoothScrollアニメーション有りでJTextAreaの任意の行まで移動します。

概要

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

サンプルコード

Document doc = textArea.getDocument();
Element root = doc.getDefaultRootElement();
int ln = getDestLineNumber(textField, root);
if (ln < 0) {
  Toolkit.getDefaultToolkit().beep();
  return;
}
try {
  final Element elem = root.getElement(ln - 1);
  final Rectangle dest = textArea.modelToView(elem.getStartOffset());
  final Rectangle current = scroll.getViewport().getViewRect();
  new Timer(20, new ActionListener() {
    @Override public void actionPerformed(ActionEvent ae) {
      Timer animator = (Timer) ae.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 ble) {
  Toolkit.getDefaultToolkit().beep();
}
View in GitHub: Java, Kotlin

解説

java.swing.Timerでイベントを発生させ、目的位置と現在位置の差の半分だけViewRectのスクロールを繰り返すことで、アニメーションを行っています。

参考リンク

コメント