Swing/SmoothScroll のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/SmoothScroll へ行く。
- title: JTextAreaでSmoothScrollによる行移動 tags: [JScrollPane, JViewport, Animation, JTextArea] author: aterai pubdate: 2007-08-13T13:01:23+09:00 description: SmoothScrollアニメーション有りで任意の行まで移動します。
概要
SmoothScroll
アニメーション有りで任意の行まで移動します。
Screenshot
Advertisement
サンプルコード
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
のスクロールを繰り返すことで、アニメーションを行っています。