JSlider问题:在leftclick之后的位置

时间:2009-02-05 23:30:20

标签: java swing user-interface jslider

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

3 个答案:

答案 0 :(得分:18)

这看起来很奇怪,实际上是控制这种行为的外观。看一下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);
    }
});

答案 1 :(得分:4)

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

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(p.x);

                setValue(value);
            }
            // disable check that will invoke scrollDueToClickInTrack
            @Override public boolean shouldScroll(int dir) {
                return false;
            }
        };
        addMouseListener(tl);
    }
};

答案 2 :(得分:0)

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