我有一个 JSlider,最小值为 0,最大值为 100。当 JSlider 首次启动时,值为 0。
现在,当我在 50,甚至 20 或 100 上单击鼠标时,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);
}
});