Java JSpinner对Windows上的MouseWheelEvent没有反应

Java JSpinner对Windows上的MouseWheelEvent没有反应,java,swing,mousewheel,mouselistener,jspinner,Java,Swing,Mousewheel,Mouselistener,Jspinner,这让我很困惑: 我有一个小应用程序,它使用JSpinner表示数值。我添加了一个MouseAdapter,根据结果事件的getScrollAmount()和getWheelRotation()设置值 只要应用程序在linux上运行(Debian Wheezy、OracleJDK1.6.032),一切都很正常。也就是说,在JSpinner具有焦点的情况下滚动鼠标滚轮可以正常工作(使用GTK LookAndFeel) 在Microsoft Windows上测试软件暴露了不同的行为: JSpinner

这让我很困惑: 我有一个小应用程序,它使用
JSpinner
表示数值。我添加了一个
MouseAdapter
,根据结果事件的
getScrollAmount()
getWheelRotation()
设置值

只要应用程序在linux上运行(Debian Wheezy、OracleJDK1.6.032),一切都很正常。也就是说,在JSpinner具有焦点的情况下滚动鼠标滚轮可以正常工作(使用GTK LookAndFeel)

在Microsoft Windows上测试软件暴露了不同的行为:
JSpinner
不会对鼠标滚轮移动做出反应
LookAndFeel
s在这里似乎不是问题,因为我已经在Linux和Windows上尝试了
MetalLookAndFeel

关于如何让这个JSpinner对两个操作系统上的
mouseweelEvent
s做出反应,有什么建议吗


谢谢。

嗯,我不确定会出什么问题,但这里的代码是在windows 7上设计的,工作正常,因此可以在您的系统上试用,看看代码的不同之处:

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

/**
 *
 * @author David
 */
public class JSpinnerMouse extends JFrame {

    private JSpinner jspinner;

    public JSpinnerMouse() {
        createAndShowUI();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, you can set the GUI to another look and feel.
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JSpinnerMouse jSpinnerMouse = new JSpinnerMouse();
            }
        });
    }

    private void createAndShowUI() {
        setTitle("JSpinner using mouse wheel");
        setSize(300, 300);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        addComponentsToContentPane(getContentPane());
        addListeners();
        setVisible(true);
    }

    private void addComponentsToContentPane(Container contentPane) {
        jspinner = new JSpinner();
        contentPane.add(jspinner);
    }

    private void addListeners() {
        this.addMouseWheelListener(new MouseWheelListener() {

            @Override
            public void mouseWheelMoved(MouseWheelEvent mwe) {
                if (MouseWheelEvent.WHEEL_UNIT_SCROLL == mwe.getScrollType()) {
                    int value = (int) jspinner.getValue();
                    if (mwe.getWheelRotation() == -1) {//up
                        jspinner.setValue(value + 1);
                    } else {//down
                        jspinner.setValue(value - 1);
                    }
                }
            }
        });
    }
}

另外,我在MouseWheelEvent中找不到像您所说的那样的getDirection()方法,因此我使用了getUnitsToScroll(),它将根据方向返回正值或负值。也许这就是造成麻烦的原因。您在MouseWheelEvent类的何处找到getDirection()方法?

很抱歉调用它
getDirection()
,实际上我使用了
getWheelRotation()
来获取方向。我会尽快尝试你的建议,这似乎正是我想要的!哦,我明白了,我编辑了上面的代码以适应您所做的工作,它在我的windows上运行得非常好。谢谢您的帮助!这就成功了,它在WindowsXP、Windows7和DebianGNU/Linux上运行得非常好。我仍然想知道为什么
getWheelRotation()
在Windows上让我失败。好吧,看来这毕竟不是
getWheelRotation()
的错:您更新的代码在我的Windows上也运行良好。结论:问题出在别处,然而,你已经指出了这一点。非常感谢。