【问题标题】:JSpinner not reacting on MouseWheelEvent on WindowsJSpinner 没有对 Windows 上的 MouseWheelEvent 做出反应
【发布时间】:2012-06-15 23:13:17
【问题描述】:

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

只要应用程序在 linux 上运行(Debian Wheezy,Oracle JDK 1.6.0_32),一切都运行良好。也就是说,在 JSpinner 获得焦点时滚动鼠标滚轮效果很好(使用 GTK LookAndFeel)。

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

关于如何让这个 JSpinner 在两个操作系统上对MouseWheelEvents 做出反应有什么建议吗?

谢谢。

【问题讨论】:

    标签: java swing mousewheel mouselistener jspinner


    【解决方案1】:

    嗯,我不确定哪里出了问题,但这是在 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 XP、Windows 7 和 Debian GNU/Linux 上完美运行。我仍然想知道为什么 getWheelRotation() 在 Windows 上失败了。
    • 好吧,看来这毕竟不是getWheelRotation() 的错:您更新的代码也适用于我的Windows。结论:问题出在其他地方,但是,您指出了这一点。谢谢。
    猜你喜欢
    • 2016-04-30
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2017-11-08
    • 2018-12-23
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多