【问题标题】:Set JSlider limits设置 JSlider 限制
【发布时间】:2015-08-05 14:36:35
【问题描述】:

我有一个从 minmax 值的 JSlider。我想为滑块的移动设置一个范围限制。

即我想将滑块限制从 -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);
  }
}

【问题讨论】:

  • 这不是 JSlider 的工作方式。将 -45 和 60 作为最小和最大限制。
  • 所以我想我需要重写一些东西才能获得我想要的结果。

标签: java swing jslider limits


【解决方案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);
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    有一种快速肮脏的方法可以做到这一点,但这违反了一些设计原则,如 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);
                          }
                        }
    );
    

    在这个解决方案中,如果用户试图拖动拇指系统将允许超出限制,但一旦用户释放鼠标,它将设置为限制。

    【讨论】:

    • 它可以工作,但如果在鼠标拖动过程中拇指也被阻止应该会更好。
    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多