2015-08-05 2 views
1

J'ai un JSlider qui va de min à max. Je veux définir une limite de plage pour les mouvements des curseurs.Définir les limites JSlider

I.e. Je veux mettre des limites de curseur de -90 à 90, mais je veux déplacer le curseur seulement entre -45 et 60. Dans ce cas, le curseur n'atteint pas les limites mais il est bloqué avant de l'atteindre.

Comment puis-je obtenir ce résultat?

import java.awt.BorderLayout; 

import javax.swing.BoundedRangeModel; 
import javax.swing.JFrame; 
import javax.swing.JSlider; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class TickSlidersSnapToTicks { 
    public static void main(String args[]) { 
    JFrame frame = new JFrame("Tick Slider"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JSlider slider = new JSlider(-90, 90, 0); 

    // Major Tick 25 - Minor 5 
    jSliderOne.setMinorTickSpacing(5); 
    jSliderOne.setMajorTickSpacing(25); 
    jSliderOne.setPaintTicks(true); 

    // I want to put here slider block limits 
    // ... 

    frame.add(jSliderOne, BorderLayout.NORTH); 
    frame.setSize(300, 200); 
    frame.setVisible(true); 
    } 
} 
+0

Ce n'est pas la façon dont fonctionne un JSlider. Mettez les -45 et 60 comme limites minimum et maximum. –

+0

Donc, je suppose que j'ai besoin de remplacer quelque chose afin d'obtenir le résultat que je veux. – Jepessen

Répondre

1

Cette solution fonctionne (notez l'astuce pour laisser le curseur penser que l'utilisateur a relâché la souris):

public class InnerSlider extends JSlider { 

    int innerMin, innerMax; 

    public InnerSlider(int min, int max, int innerMin, int innerMax){ 
     super(min,max); 
     this.innerMin = innerMin; 
     this.innerMax= innerMax; 
     addChangeListener((e) -> { 
      if(getValue() < innerMin){ 
       setValue(innerMin); 
       getMouseListeners()[0].mouseReleased(null); 
      }else if(getValue() > innerMax){ 
       setValue(innerMax); 
       getMouseListeners()[0].mouseReleased(null); 
      } 
     }); 
    } 
} 
+0

Merci cela fonctionne comme prévu. – Jepessen

0

Il existe un moyen rapide de le faire, mais cela va à l'encontre de certains principes de conception tels que LSP.

JSlider jSliderOne = new JSlider(); 

    // Major Tick 25 - Minor 5 
    jSliderOne.setMinorTickSpacing(5); 
    jSliderOne.setMajorTickSpacing(25); 
    jSliderOne.setPaintTicks(true); 
    jSliderOne.setModel(new DefaultBoundedRangeModel() 
        { 
         @Override 
         public void setValue(int n) 
         { 
         if (n > 50) 
         { 
          n = 50; 
         } 
         else if (n < -45) 
         { 
          n = -45; 
         } 

         super.setValue(n); 
         } 
        } 
); 

dans cette solution, si l'utilisateur tente de faire glisser le système de pouce permettra d'aller au-delà de la limite, mais une fois que la libération de l'utilisateur de la souris, il sera réglé sur LIMIT.

+0

Le système d'exploitation fonctionne mais il devrait être meilleur si le pouce est bloqué pendant le déplacement de la souris. – Jepessen