TITLE:JTextAreaでSmoothScrollによる行移動
#navi(../)
*JTextAreaでSmoothScrollによる行移動 [#qdf0c9e9]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2007-08-13~
更新日:&lastmod;

#contents

**概要 [#bcc95e88]
SmoothScrollアニメーション有りで任意の行まで移動します。

#screenshot

**サンプルコード [#u2a76de6]
#code{{
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() {
    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();
}
}}
-&jnlp;
-&jar;
-&zip;

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

//**参考リンク
**コメント [#o3d598ba]
#comment