0

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

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

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

关于如何让这个 JSpinnerMouseWheelEvent在两个操作系统上对 s 做出反应的任何建议?

谢谢你。

4

1 回答 1

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() 方法?

于 2012-06-15T23:29:50.503 回答