Présentation
Peut remplacer aisément un JScrollBar classique :
/*
*Exemple d'utilisation
*/
scrollPane.setVerticalScrollBar(new inertialScrollBar(2)); //2 représente le "poid virtuel" pour le calcul d'inertie et scrollPane est un objet de type JScrollPane
/*
*Exemple d'utilisation
*/
scrollPane.setVerticalScrollBar(new inertialScrollBar(2)); //2 représente le "poid virtuel" pour le calcul d'inertie et scrollPane est un objet de type JScrollPane
|
Téléchargement
|
Compatibilité
|
package impsa.engine2D.component; import javax.swing.JScrollBar; { /** * */ private static final long serialVersionUID = 1L; private static final int PAS_MIN = 6; //Pixel Increment private static final int PAS_MAX = 1000; //Pixel Increment private boolean isInertial = false; private int sampling = 10; //Sampling in ms private int previouPosition = 0; private double previouSpeed = 0; private long previousTime = 0; private double kineticEnergy = 0; //KineticEnergy private double weight = 0; //Virtual knob weight private double pas = 1; //pas private double accelerationFactor = 1.0987; //Acceleration Factor private double deccelerationFactor = 1.1; //Acceleration Factor private long accelerationHandleTime = 300; //Acceleration handle ms public inertialScrollBar(double weight) { this.weight = weight; // this.setUnitIncrement(16); this.setBlockIncrement(16); startIntertie(); } public void stopIntertie() { isInertial = false; inertialThread.interrupt(); try { inertialThread.join(); e.printStackTrace(); } } public void startIntertie() { isInertial = true; inertialThread.start(); } private double calculKinetic(double speed) { return (0.5 * weight * (speed*speed)); } private double calculSpeed(double kineticEnergy) { } @Override public void run() { int sense = 1; while (isInertial) { if (! this.getValueIsAdjusting()) { if (this.getValue() != previouPosition) //Position changed (movement detected) { previouSpeed = (this.getValue() - previouPosition); //Get speed (difference between old and new position9 //If the sense has changed { pas = PAS_MIN; } //Get Sense if (previouSpeed > 0) sense = 1; else sense = -1; //Acceleration Limit (maximum limit) if (pas <= PAS_MAX) pas = pas * accelerationFactor; //Acceleration for each new movement else pas = PAS_MAX; } else if (System.currentTimeMillis() - previousTime >= accelerationHandleTime ) //If no movement detected during "accelerationHandleTime" { //Deceleration Limit (minimum limit) if (pas >= PAS_MIN) pas = pas / deccelerationFactor; //Acceleration for each new movement else pas = PAS_MIN; //Reset Acceleration to minimum } this.setUnitIncrement((int) (pas)); //Set the increment speed kineticEnergy = calculKinetic(previouSpeed); //Calculate Kinetic energy kineticEnergy = kineticEnergy - 0.2*(previouSpeed*previouSpeed); //Decrease Kinetic Energy if (kineticEnergy < 0.1) kineticEnergy = 0; previouSpeed = calculSpeed(kineticEnergy); //Calculate new speed this.setValue((int) (this.getValue() + previouSpeed*sense)); //Set new knob value } previouPosition = this.getValue(); //Get actual knob position try { } } } } public void restart() { previouPosition = 0; previouSpeed = 0; previousTime = 0; kineticEnergy = 0; this.calculSpeed(kineticEnergy); } public void setWeight(double weight) { this.weight = weight; } }
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.




