每当我单击 JSlider 时,它都会在单击方向上定位一个 MajorTick,而不是跳转到我实际单击的位置。(如果滑块位于点 47 并且我单击 5,它将跳转到 37 而不是 5)。使用 JSliders 时有什么方法可以改变这一点,或者我是否必须使用其他数据结构?

有帮助吗?

解决方案

尽管这看起来很奇怪,但实际上是外观和感觉控制了这种行为。看一眼 BasicSliderUI, ,您需要重写的方法是 scrollDueToClickInTrack(int).

为了设置的值 JSlider 到用户单击轨道的位置最接近的值,您需要在鼠标坐标之间进行一些花哨的裤子转换 getMousePosition() 到一个有效的跟踪值,考虑到的位置 Component, ,它的方向、大小和刻度之间的距离 ETC. 。幸运的是, 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(p.x);

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

此行为是从OS的。你确定你要重新定义它,迷惑用户?我不认为如此。 ;)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top