2015-08-05 6 views
1

У меня есть JSlider, который идет от min до max значений. Я хочу установить предел диапазона для движений ползунка.Установленные ограничения JSlider

I.e. Я хочу установить пределы ползунка от -90 до 90, но я хочу переместить ползунок только между -45 и 60. В этом случае слайдер не достигает пределов, но он блокируется перед его достижением.

Как я могу получить этот результат?

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

Это не способ, которым JSlider работает. Положите -45 и 60 в качестве минимального и максимального пределов. –

+0

Так что, я полагаю, мне нужно переопределить что-то, чтобы получить результат, который я хочу. – Jepessen

ответ

1

Это решение работает (обратите внимание на трюк, чтобы бегунок думать, что пользователь отпустит кнопку мыши):

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

Спасибо, что работает. – Jepessen

0

Существует быстрый грязный способ сделать это, но это нарушает некоторые принципы проектирования, такие как 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); 
         } 
        } 
); 

в этом растворе, если пользователь пытается перетащить систему большого пальца позволит выйти за пределы лимита, но как только пользователь отключился мышь будет установлен предел.

+0

IT работает, но лучше, если большой палец также заблокирован при перетаскивании мыши. – Jepessen

 Смежные вопросы

  • Нет связанных вопросов^_^