Java - MouseWheelEvent触发两次

时间:2012-12-02 03:44:33

标签: java swing jframe

我正在制作一个摇摆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的构造函数中,并验证它只在那里发生。

1 个答案:

答案 0 :(得分: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++;
        }
    }
};