JSpinner在Windows上没有对MouseWheelEvent做出反应

时间:2012-06-15 23:13:18

标签: java swing mousewheel mouselistener jspinner

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

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

在Microsoft Windows上测试软件会暴露出不同的行为: JSpinner对鼠标滚轮移动不起作用。 LookAndFeel似乎不是问题,因为我已经在Linux和Windows上尝试MetalLookAndFeel

有关如何让这个JSpinner在两个操作系统上对MouseWheelEvent做出反应的任何建议吗?

谢谢。

1 个答案:

答案 0 :(得分: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()方法?