3

我正在开发一个swing JFrame,该程序的一项功能涉及使用鼠标的滚轮在窗口中缩放图像。我已经实现了一个 MouseAdapter,它被添加为 JFrame 本身的 MouseWheelListener。

/**
 * Handles scroll wheel activity.
 */
private MouseAdapter wheelListener = new MouseAdapter() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int notches = e.getWheelRotation();
        System.out.println(notches);
        while (notches > 0) {
            controller.zoomIn();
            notches--;
        }
        while (notches < 0) {
            controller.zoomOut();
            notches++;
        }
    }
};

在 JFrame 构造函数中:

public MainFrame() {
    ...
    addMouseWheelListener(wheelListener);
    ...
}

我遇到的问题是,滚动滚轮时,每次“点击”事件都会触发两次。我找不到有类似问题的人。

我尝试if(e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) { ... }使用该mouseWheelMoved方法来查看是否发生了两种不同类型的事件,但它们都是WHEEL_UNIT_SCROLL's.

我还尝试打印出事件的源以查看它是否来自不同的窗口/窗格,但它们都来自我的主 JFrame 窗口。

有谁知道,或者可以发现,为什么我应该得到两个事件,而我应该得到一个?

编辑:在添加轮侦听器部分放错行,对不起。编辑:经过一些测试,我能够用来.hashCode()验证有两个独特的MouseWheelEvents. 我怀疑 MouseAdapter 以某种方式被添加了两次。我将它添加到 MainFrame 的构造函数中,并验证它只在那里发生一次。

4

1 回答 1

1

添加一个 e.consume() 可以解决这个问题。

private MouseAdapter wheelListener = new MouseAdapter() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        e.consume() // avoid the event to be triggred twice
        int notches = e.getWheelRotation();
        System.out.println(notches);
        while (notches > 0) {
            controller.zoomIn();
            notches--;
        }
        while (notches < 0) {
            controller.zoomOut();
            notches++;
        }
    }
};
于 2014-12-03T22:49:48.273 回答