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