我有一个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);
}
});