正如我们所知MouseEvent
,迷失在 中JScrollPane
,即未交付给父母,这是一个尚未修复的旧错误:
https ://forums.oracle.com/forums/thread.jspa?threadID=1362237
因此,我通过使用临时侦听器捕获事件JScrollPane
然后将事件分派给它的父级来使用真正的侦听器进行处理来使用变通方法。
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 调用和设置按钮。