Sen yumuşak kaydırma efekti elde etmek kaydırma sırasında javax.swing.Timer
kullanabilirsiniz. Eğer bileşen dışında bu tetikleme, bu gibi somthing çalışır (component
JScrollPane
bileşen içinde olduğu):
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
yöntemi bir hareket hızı fonksiyonu doğrusal bir dönüştürme ve olarak uygulanabilirler bunu hissetmek istiyorum nasıl bağlı bunlardan biri:
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;
}
Bu muhtemelen kaydırdığı bu satırlar boyunca bir şey yaptığında da öyle bir bileşen içinde çalışmaya adapte edilebilir.
Veya, eğer mümkünse, sen Salıncak daha animasyon için çok daha iyi desteği vardır JavaFX kullanabilirsiniz.