如何使用鼠标滚轮移动JSlider

3

我有这段代码,但是没有任何反应。我不知道为什么degreesSlider.getValue() + 1不起作用。如果有任何建议,我将不胜感激。

degreesSlider.addMouseWheelListener(new MouseWheelListener() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int notches = e.getWheelRotation();
        if (notches < 0) {
            System.out.println("Mouse wheel moved UP " + -notches + " notch(es)");
            degreesSlider.setValue(degreesSlider.getValue() + 1);
        } else {
            System.out.println("Mouse wheel moved DOWN " + notches + " notch(es)");
            degreesSlider.setValue(degreesSlider.getValue() - 1);
        }
    }
});

你的监听器中的代码是否被执行? - Lukas Knuth
是的。运行: 鼠标滚轮向上移动1个刻度 - Apopei Andrei Ionut
2
你为滑块设置了什么最小/最大值?也许1对你来说差异太小而无法注意到? - Lukas Knuth
现在我认为我找到了问题所在。感谢@Lukas Knuth。最小值是1,最大值是360;minorTickSpacing为5,majorTickSpacing为10。如果我在代码中将1更改为5或10,则可以正常工作。因此,只有在我放置minor/majorTickSpacing的除数时才能正常工作。 - Apopei Andrei Ionut
2个回答

2
试着运行Swing教程中的代码,链接为如何编写鼠标滚轮监听器。当我运行该代码时,发现每滚动3个单位才会出现“缺口”,也就是说,当您向上滚动时,实际上每向上滚动一次,就会出现3次向下滚动,滑块会慢慢移向0。

作为一个快速解决方法,我只需要:

    if (notches < 0) {
        System.out.println("Mouse wheel moved UP " + -notches + " notch(es)");
        slider.setValue(slider.getValue() + 1);
    } else
    if (notches > 0) {
        System.out.println("Mouse wheel moved DOWN " + notches + " notch(es)");
        slider.setValue(slider.getValue() - 1);
    }

2

这是用于通过鼠标滚轮旋转移动 JSlider 的代码示例。我希望这能够帮助您更有效地处理 JSlider 的鼠标滚轮旋转。

import javax.swing.*;
import java.awt.event.*;
public class JSliderDemo extends JFrame implements MouseWheelListener
{
    JSlider degreesSlider;
    public void prepareAndShowGUI()
    {
        degreesSlider = new JSlider(0,100);
        degreesSlider.setMajorTickSpacing(2);
        degreesSlider.setMinorTickSpacing(1);
        degreesSlider.setPaintLabels(true);
        degreesSlider.setPaintTicks(true);
        degreesSlider.setPaintTrack(true);
        degreesSlider.addMouseWheelListener(this);
        getContentPane().add(degreesSlider);
        setSize(1000,100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    @Override
    public void mouseWheelMoved(MouseWheelEvent evt)
    {
        if (evt.getWheelRotation() < 0 )//mouse wheel was rotated up/away from the user
        {
            int iNewValue = degreesSlider.getValue() - degreesSlider.getMinorTickSpacing()  ;
            if (iNewValue >= degreesSlider.getMinimum())
            {
                degreesSlider.setValue(iNewValue);
            }
            else
            {
                degreesSlider.setValue(0);
            }
        }
        else
        {
            int iNewValue = degreesSlider.getValue() + degreesSlider.getMinorTickSpacing()  ;
            if (iNewValue <= degreesSlider.getMaximum())
            {
                degreesSlider.setValue(iNewValue);
            }
            else
            {
                degreesSlider.setValue(degreesSlider.getMaximum());
            }
        }
    }
    public static void main(String[] st)
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                JSliderDemo jsd = new JSliderDemo();
                jsd.prepareAndShowGUI();
            }
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接