如何防止JSlider移动全范围?

时间:2016-01-02 01:03:24

标签: java swing jslider changelistener

我有一个应用程序,我希望使用indexPath作为用户输入,表示绝对值的百分比。
 根据其他变量,最小/最大百分比值将受到限制。我不想改变JSlider本身的比例(最小值/最大值)(我想保留全范围百分比表)。我创建了一个JSlider来确定是否需要限制范围,在这样的情况下,我使用适当的(有限的最小/最大)值调用ChangeListener方法。但是,JSlider.setValue()本身并不反映我设定的价值。如果我用JSlider查询值,它会返回我期望的值(我设置的值)。

有没有办法强制JSlider.getValue()只允许将实际滑块(​​拇指,旋钮)拖动到某个点,然后停止?

更新

在花了太多时间之后,我已经确定根本问题是我在一个非预期的使用模型中滥用/滥用JSlider。限制拇指的移动范围小于BoundedRangeModel范围需要修改BasicSliderUI类。虽然下面的 aterai 提出的原始解决方案确实有效,但它需要覆盖SliderUI实现类,从而影响plaf的可移植性和一致性。因此,要么必须找到不同的UI元素,要么根据其他相互依赖的变量值修改JSlider BoundedRangeModel限制。后者的缺点是,相同的拇指位置将根据其他用户可编辑参数的值表示不同的值。

2 个答案:

答案 0 :(得分:3)

您可以覆盖createTrackListener(...)的{​​{1}}方法,以防止拖动。

enter image description here

修改

  • 另一种选择是使用MetalSliderUI(未经测试的代码,可能需要进行一些自定义以适用于其他JLayer):
LookAndFeel

答案 1 :(得分:0)

似乎没有办法以一种在不同的外观和感觉实现中保持一致的方式做我想要的事情。跟踪JSlider,BasicSliderUI和BoundedRangeModel的通知和监听器,结果表明无法通过公共方法强制重新计算拇指位置,并且基本监听器实现专门防止在拖动或终止拖动时发生这种情况(鼠标释放)。有关详细信息,请参阅原始问题的更新。