简体   繁体   English

设置JSlider限制

[英]Set JSlider limits

I have a JSlider that goes from min to max values. 我有一个从minmax的JSlider。 I want to set a range limit for slider movements. 我想为滑块移动设置范围限制。

Ie I want to put slider limits from -90 to 90, but I want to move the slider only between -45 and 60. In this case the slider does not reach limits but it's blocked before reaching it. 即,我想将滑块限制从-90到90,但我只想在-45到60之间移动滑块。在这种情况下,滑块没有达到限制,但是在到达之前被阻塞。

How can I obtain this result? 如何获得此结果?

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

This solution works (note the trick to let the slider think that the user released the mouse): 此解决方案有效(请注意使滑块认为用户释放了鼠标的技巧):

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

There is quick dirty way to do this,but this violate some design principles like LSP. 有一种快速的肮脏的方法来执行此操作,但这违反了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);
                      }
                    }
);

in this solution, if user tries to drag the thumb system will allow to go beyond the limit, but once user release the mouse it will set to limit. 在此解决方案中,如果用户尝试拖动拇指系统,则允许超出限制,但是一旦用户释放鼠标,它将设置为限制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM