JSlider - 点击使点朝这个方向前进

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSlider - 点击使点朝这个方向前进相关的知识,希望对你有一定的参考价值。

我有一个JSlider,最小值为0,最大值为100.当JSlider首次启动时,值为0。

现在,当我在50,甚至20或100上单击鼠标时,JSlider不会移动到我单击的位置。它只是向右跳一点点。

我该怎么做才能使价值达到我点击的任何价值?

答案

这是一个可以满足你需要的课程的开始。

一般的想法是检测用户点击的位置并计算必要的值偏移量以匹配新的滑块位置。

// 'E' stands for enhanced
public class EJSlider extends JSlider {

   public EJSlider() {
      super();
      addMouseListener(new MouseAdapter() {
         @Override
         public void mousePressed(MouseEvent e) {
            Point p = e.getPoint();
            double percent = p.x / ((double) getWidth());
            int range = getMaximum() - getMinimum();
            double newVal = range * percent;
            int result = (int)(getMinimum() + newVal);
            setValue(result);
         }
      });
   }

   public static void main(String[] args) {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.add(new EJSlider());
      f.pack();
      f.setVisible(true);
   }
}

只需运行示例即可。滑块将跳转到您单击鼠标的任何位置。这尚未经过彻底测试,但不适用于垂直滑块。

一个类似的解决方案就是将我的自定义MouseListener添加到您希望该功能的任何JSlider上。

(注意,我知道它还不完美,但这是一个好的开始。)

另一答案

BasicSliderUI提供了一种名为valueForXPosition的方法:

返回x位置的值。如果xPos超出左侧或右侧的轨道,则此方法将值设置为滑块的最小值或最大值,具体取决于滑块是否反转。

(对于垂直滑块使用valueForYPosition

使用valueForXPosition将MouseListener添加到水平JSlider的示例:

JSlider slider = new JSlider();
slider.setOrientation(JSlider.HORIZONTAL);
slider.setMinimum(0);
slider.setMaximum(100); 
slider.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
       JSlider sourceSlider=(JSlider)e.getSource();
       BasicSliderUI ui = (BasicSliderUI)sourceSlider.getUI();
       int value = ui.valueForXPosition( e.getX() );
       slider.setValue(value);
    }
});

以上是关于JSlider - 点击使点朝这个方向前进的主要内容,如果未能解决你的问题,请参考以下文章

这个 UIAlertAction 代码有啥问题?不允许点击/点击并在应用程序中前进

在片段和活动之间进行通信 - 最佳实践

HTML代码片段

HTML代码片段

如何将 JSlider 设置为音频文件的持续时间?

改变 JSlider 的外观和感觉