2011-08-17 36 views
1

我有一个JSlider的0最小值及100最大值当JSlider的第一次启动,则该值为0JSlider的 - 击可以点去朝那个方向

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

我该如何做到这一点,以便我点击任何东西时的价值?

+0

为什么要实现非标准行为?潜在的混淆你的用户..保持鼠标按下,拇指将最终到达鼠标 – kleopatra

回答

3

这是一个能够满足你需要的类的开始。

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

// '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你想要的功能。

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

+0

我会期望你会重写JSlider中的一些方法。目前还不清楚为什么你的方法在JSlider中移动旋钮之后调用。 – toto2

+0

@ toto2,我的方法被调用为鼠标点击操作的一部分。标准'JSlider'通过将滑块前进一个位置来处理咔嗒声。我的动作会将滑块移动到用户点击的值。这些事情发生的顺序并不重要。 – jjnguy

+0

我的意思是标准的JSlider移动也必须从鼠标点击的事件处理程序中调用。如果您的方法先被调用,然后再调用其他方法,那么顺序会是错误的;滑块最终会出现在错误的地方。 – toto2