Swing/SmoothScroll のバックアップソース(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/SmoothScroll へ行く。
TITLE:JTextAreaでSmoothScrollによる行移動 #navi(../) RIGHT:Posted by [[aterai]] at 2007-08-13 *JTextAreaでSmoothScrollによる行移動 [#qdf0c9e9] SmoothScrollアニメーション有りで任意の行まで移動します。 -&jnlp; -&jar; -&zip; //#screenshot #ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTTSaxFSzI/AAAAAAAAAkI/KtedLqwCXBY/s800/SmoothScroll.png) **サンプルコード [#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(); } }} **解説 [#kad57b23] java.swing.Timerでイベントを発生させ、目的位置と現在位置の差の半分だけViewRectのスクロールを繰り返すことで、アニメーションを行っています。 **参考リンク [#ua27efde] -[[JTextAreaの任意の行に移動>Swing/GotoLine]] **コメント [#o3d598ba] #comment