2012-11-25 23 views
5

Orta derecede yüksek blok artışlı bir JScrollPane (125) var. Pürüzsüz/yavaş kaydırma uygulamak istiyorum, böylece kaydırma yaparken atlamıyor (veya atlamıyor). Bunu nasıl yapabilirim?JScrollPane - Düzgün Kaydırma

Windows'un 8.

Herhangi bir yardım büyük takdir gibi kaydırma düşünüyordum!

cevap

1

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 (componentJScrollPane 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.