2012-11-25 9 views
5

私は、適度に高いブロックインクリメント(125)のJScrollPaneを持っています。スムーズ/スロースクロールを適用して、スクロールするときにジャンプ(またはスキップ)しないようにしたいと思います。これどうやってするの?JScrollPane - スムーズスクロール

私は、Windows 8

任意の助けをいただければ幸いようにスクロールを考えていました!

答えて

1

スクロール中にjavax.swing.Timerを使用するとスムーズなスクロール効果が得られます。もしコンポーネント外部からこれをトリガしている場合、このような気にいらが動作する(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方法は、直線から緩和関数への変換であり、以下のように実施されますあなたはそれを感じるようにしたいかに応じて、これらの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を使用できます。