Swing/SmoothScroll のバックアップの現在との差分(No.1)
TITLE:JTextAreaでSmoothScrollによる行移動
JTextAreaでSmoothScrollによる行移動
編集者:Terai Atsuhiro~
作成日:2007-08-13
更新日:2021-12-21 (火) 16:30:51
概要
SmoothScroll
アニメーション有りでJTextArea
の任意の行まで移動します。
Screenshot
Advertisement
概要
SmoothScrollアニメーション有りで任意の行まで移動します。#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
Document doc = textArea.getDocument();
Element root = doc.getDefaultRootElement();
#spandel
int ln = getDestLineNumber(textField, root);
#spanend
#spandel
if(ln<0) { Toolkit.getDefaultToolkit().beep(); return; }
#spanend
#spandel
try{
#spanend
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();
}
#spanadd
int ln = model.getNumber().intValue();
#spanend
#spanadd
try {
#spanend
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();
#spandel
}catch(BadLocationException ble) {
#spanend
Toolkit.getDefaultToolkit().beep();
#spanadd
} catch (BadLocationException ex) {
#spanend
UIManager.getLookAndFeel().provideErrorFeedback(textArea);
}
- &jnlp;
- &jar;
- &zip;
解説
java.swing.Timerでイベントを発生させ、目的位置と現在位置の差の半分だけViewRectのスクロールを繰り返すことで、アニメーションを行っています。解説
上記のサンプルでは、java.swing.Timer
でイベントが発生するとscrollRectToVisible(...)
メソッドを使用して目的位置と現在位置の差の半分だけViewRect
のスクロールを繰り返すことで行移動アニメーションを行っています。