2012-11-25 31 views
5

मेरे पास एक मामूली उच्च ब्लॉक वृद्धि (125) के साथ एक JScrollPane है। मैं इसे चिकनी/धीमी स्क्रॉलिंग लागू करना चाहता हूं ताकि स्क्रॉल करते समय यह कूद न जाए (या छोड़ें)। मैं यह कैसे कर सकता हूँ?JScrollPane - चिकना स्क्रॉलिंग

मैं Windows 8

किसी भी मदद की बहुत सराहना की जाएगी तरह स्क्रॉल के बारे में सोच रहा था!

उत्तर

1

चिकनी स्क्रॉलिंग प्रभाव प्राप्त करने के लिए आप स्क्रॉल के दौरान javax.swing.Timer का उपयोग कर सकते हैं। आप घटक बाहर से इस ट्रिगर कर रहे हैं, तो इस तरह somthing काम करेंगे (जहां componentJScrollPane भीतर घटक है):

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 विधि एक सहजता कार्य करने के लिए रेखीय से एक रूपांतरण है और के रूप में लागू किया जाएगा इनमें से किसी एक आप इसे कैसे महसूस करना चाहते हैं पर निर्भर करता है:

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; 
} 

यह शायद एक घटक के भीतर काम करने के लिए बहुत इसलिए जब उपयोगकर्ता स्क्रॉल यह इन पंक्तियों के साथ कुछ करता है अनुकूलित किया जा सकता।

या, यदि संभव हो, तो आप जावाएफएक्स का उपयोग कर सकते हैं जिसका स्विंग से एनीमेशन के लिए बेहतर समर्थन है।