5
私は、適度に高いブロックインクリメント(125)のJScrollPaneを持っています。スムーズ/スロースクロールを適用して、スクロールするときにジャンプ(またはスキップ)しないようにしたいと思います。これどうやってするの?JScrollPane - スムーズスクロール
私は、Windows 8
任意の助けをいただければ幸いようにスクロールを考えていました!
私は、適度に高いブロックインクリメント(125)のJScrollPaneを持っています。スムーズ/スロースクロールを適用して、スクロールするときにジャンプ(またはスキップ)しないようにしたいと思います。これどうやってするの?JScrollPane - スムーズスクロール
私は、Windows 8
任意の助けをいただければ幸いようにスクロールを考えていました!
スクロール中にjavax.swing.Timer
を使用するとスムーズなスクロール効果が得られます。もしコンポーネント外部からこれをトリガしている場合、このような気にいらが動作する(component
がJScrollPane
内成分である):
final int target = visible.y;
final Rectangle current = component.getVisibleRect();
final int start = current.y;
final int delta = target - start;
final int msBetweenIterations = 10;
Timer scrollTimer = new Timer(msBetweenIterations, new ActionListener() {
int currentIteration = 0;
final long animationTime = 150; // milliseconds
final long nsBetweenIterations = msBetweenIterations * 1000000; // nanoseconds
final long startTime = System.nanoTime() - nsBetweenIterations; // Make the animation move on the first iteration
final long targetCompletionTime = startTime + animationTime * 1000000;
final long targetElapsedTime = targetCompletionTime - startTime;
@Override
public void actionPerformed(ActionEvent e) {
long timeSinceStart = System.nanoTime() - startTime;
double percentComplete = Math.min(1.0, (double) timeSinceStart/targetElapsedTime);
double factor = getFactor(percentComplete);
current.y = (int) Math.round(start + delta * factor);
component.scrollRectToVisible(current);
if (timeSinceStart >= targetElapsedTime) {
((Timer) e.getSource()).stop();
}
}
});
scrollTimer.setInitialDelay(0);
scrollTimer.start();
getFactor
方法は、直線から緩和関数への変換であり、以下のように実施されますあなたはそれを感じるようにしたいかに応じて、これらの1:
private double snap(double percent) {
return 1;
}
private double linear(double percent) {
return percent;
}
private double easeInCubic(double percent) {
return Math.pow(percent, 3);
}
private double easeOutCubic(double percent) {
return 1 - easeInCubic(1 - percent);
}
private double easeInOutCubic(double percent) {
return percent < 0.5
? easeInCubic(percent * 2)/2
: easeInCubic(percent * -2 + 2)/-2 + 1;
}
これはおそらく、ユーザーがスクロールし、それはこれらの線に沿って何かをするときもそうコンポーネント内で動作するように適合させることができます。
または可能であれば、Swingよりもアニメーションのサポートがはるかに優れたJavaFXを使用できます。