据我们所知,MouseEvent
在 JScrollPane
中丢失了,即没有传递给父级,这是一个尚未修复的旧错误:
https://forums.oracle.com/forums/thread.jspa?threadID=1362237
所以我使用临时监听器捕获 JScrollPane
中的事件,然后将事件分派(dispatch)给它的父级事件,以使用真正的监听器进行处理。
private class DispatchListener extends MouseAdapter {
@Override
public void mousePressed (MouseEvent me) {
System.out.println("dispatch.mousePressed: " + me.getButton());
preDispatchEvent(me);
}
@Override
public void mouseReleased (MouseEvent me) {
preDispatchEvent(me);
}
@Override
public void mouseDragged (MouseEvent me) {
System.out.println("dispatch.mouseDragged");
preDispatchEvent(me);
}
private void preDispatchEvent (MouseEvent me) {
JScrollPane pane = (JScrollPane)me.getSource();
MouseEvent newMe = SwingUtilities.convertMouseEvent(pane.getViewport(), me, tablePanel);
dispatchEvent(newMe);
}
}
它工作正常,但是使用 Java 7 的人开始提示鼠标点击在应用程序中没有反应。降级到 Java 6 后问题得到解决,但现在我正在测试 Applet
和 Chrome
迫使我将插件升级到版本 7。
调试后我发现 convertMouseEvent
将按钮设置为 MouseEvent.NOBUTTON
独立于按钮传递
MouseEvent newMe = SwingUtilities.convertMouseEvent(pane.getViewport(), me, tablePanel);
来自 Eclipse 中的源代码
else {
newEvent = new MouseEvent(newSource,
sourceEvent.getID(),
sourceEvent.getWhen(),
sourceEvent.getModifiers(),
p.x,p.y,
sourceEvent.getXOnScreen(),
sourceEvent.getYOnScreen(),
sourceEvent.getClickCount(),
sourceEvent.isPopupTrigger(),
MouseEvent.NOBUTTON ); //!!!
}
return newEvent;
不知道为什么要这样实现?这是另一个错误或功能吗?
似乎我需要创建自己的对象而不调用 SwingUtilities.convertMouseEvent
并从 sourceEvent 设置按钮。
最佳答案
这是一个有趣的问题。在 SwingUtilities.convertMouseEvent
中使用 MouseEvent.NOBUTTON
确实看起来很奇怪。但是,我无法用 Java 7 重现该问题;对我来说,转换后的鼠标事件的 button
字段对于 Java 7 和 6 是正确的(在 Windows 7 笔记本电脑上使用 1.7.0-b147 64 位和 1.6.0_21-b07 64 位)。
通过 MouseEvent
构造函数进行调试,我看到虽然 button
字段最初设置为零,但在结束时调用 setNewModifiers
构造函数根据 modifiers
字段更改 button
(当在 中构造转换后的鼠标事件时,该字段从
).sourceEvent.getModifiers
接收其值) SwingUtilities.convertMouseEvent
从单击转换的鼠标事件如下所示(对于 Java 7):
java.awt.event.MouseEvent[MOUSE_PRESSED,(185,175),absolute(593,305),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on javax.swing.JPanel[,0,0,381x259,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
java.awt.event.MouseEvent[MOUSE_RELEASED,(185,175),absolute(593,305),button=1,modifiers=Button1,clickCount=1] on javax.swing.JPanel[,0,0,381x259,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
针对您的问题:我认为 MouseEvent.NOBUTTON
被传递给 MouseEvent
构造函数,因为 按钮的值
字段将由 modifiers
字段的值决定。在我的笔记本电脑上,Java 7 和 6 的运行情况与我预期的一样,因此对我来说这不像是错误。您的应用程序是否在浏览器中运行,这对鼠标事件的转换方式有影响吗?您是否已创建变通方案来解决该问题,或者您是否可以共享一些小程序代码?
其他事件类型
由 SwingUtilities.convertMouseEvent
处理的前两种情况创建了一个 MouseWheelEvent
或一个 MenuDragMouseEvent
对象。两个构造函数(最终)调用带有 MouseEvent.NOBUTTON
参数的 MouseEvent
构造函数。 (在我的笔记本电脑上查看这些事件(没有转换),MouseWheelEvent
的 button
字段始终为零(我的鼠标只有一个滚轮)。对于 MenuDragMouseEvent
objects button
对于 menuDragMouseReleased
事件等于 1,否则为零,而 modifiers
字段始终等于 BUTTON1_MASK
。)所以看起来 MouseEvent.NOBUTTON
作为 MouseEvent
构造函数的参数非常受欢迎。
关于java - SwingUtilities.convert Mouse Event() 在 Java 7 中将按钮设置为 BUTTON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14453750/