JSlider问题:在leftclick之后的位置

每当我点击一个JSlider时,它会在点击方向上定位一个majorTick,而不是跳到我实际点击的位置。 (如果滑块位于第47点,我点击5它将跳转到37而不是5)。 有没有办法在使用JSliders时改变这个,或者我是否必须使用另一个数据结构?

尽管看起来很奇怪,但它实际上是控制这种行为的外观。 看一下BasicSliderUI ,你需要覆盖的方法是scrollDueToClickInTrack(int)

为了将JSlider的值设置为用户在轨道上单击的最近值,您需要在getMousePosition()的鼠标坐标到有效的轨道值之间进行一些花哨的裤子转换,同时考虑到Component位置,它的方向,大小和刻度之间的距离 。 幸运的是, BasicSliderUI为我们提供了两个方便的函数: valueForXPosition(int xPos)valueForYPosition(int yPos)

 JSlider slider = new JSlider(JSlider.HORIZONTAL); slider.setUI(new MetalSliderUI() { protected void scrollDueToClickInTrack(int direction) { // this is the default behaviour, let's comment that out //scrollByBlock(direction); int value = slider.getValue(); if (slider.getOrientation() == JSlider.HORIZONTAL) { value = this.valueForXPosition(slider.getMousePosition().x); } else if (slider.getOrientation() == JSlider.VERTICAL) { value = this.valueForYPosition(slider.getMousePosition().y); } slider.setValue(value); } }); 

这个问题有点陈旧,但我自己也遇到了这个问题。 这是我的解决方案:

 JSlider slider = new JSlider(/* your options here if desired */) { { MouseListener[] listeners = getMouseListeners(); for (MouseListener l : listeners) removeMouseListener(l); // remove UI-installed TrackListener final BasicSliderUI ui = (BasicSliderUI) getUI(); BasicSliderUI.TrackListener tl = ui.new TrackListener() { // this is where we jump to absolute value of click @Override public void mouseClicked(MouseEvent e) { Point p = e.getPoint(); int value = ui.valueForXPosition(px); setValue(value); } // disable check that will invoke scrollDueToClickInTrack @Override public boolean shouldScroll(int dir) { return false; } }; addMouseListener(tl); } }; 

此行为源自OS。 您确定要重新定义并混淆用户吗? 我不这么认为。 ;)