java - JSpinner 对 Windows 上的 MouseWheelEvent 没有反应

标签 java swing mousewheel mouselistener jspinner

这让我很困惑: 我有一个小型应用程序,它使用 JSpinner 来获取数值。我向其中添加了一个 MouseAdapter,根据生成的事件的 getScrollAmount()getWheelRotation() 设置值。

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

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

关于如何让 JSpinner 对两个操作系统上的 MouseWheelEvent 使用react,有什么建议吗?

谢谢。

最佳答案

嗯,我不确定可能出了什么问题,但这里是在 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() 方法?

关于java - JSpinner 对 Windows 上的 MouseWheelEvent 没有反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059273/

相关文章:

java - T 类型数组(Java 泛型)

java - 为什么我在 NetBeans 中收到 "Could not find or load main class ..."错误?

javascript - 改进 slider 的鼠标滚轮算法导航

Javascript:捕获鼠标滚轮事件并且不滚动页面?

java - MouseWheelListener java- 可以检测到框架外吗?

java - 解析 FuseESB 和 Jersey Servlet 中的两个依赖链

java - 我正在使用 @PropertySource 和 @ConfigurationProperties 的组合,但我想用外部属性文件覆盖它们

java - 如何使 JFrame 和 JMenubar 不在 public static void main(String[] args) 中

java - GSON - 从 JSON 反序列化期间修剪字符串

Java:在 jlabel 上打开图像