ConvertMouseeEvent()在Java7中将按钮设置为NOBUTTON
正如我们所知,ConvertMouseeEvent()在Java7中将按钮设置为NOBUTTON,java,swing,applet,jscrollpane,swingutilities,Java,Swing,Applet,Jscrollpane,Swingutilities,正如我们所知,MouseEvent在JScrollPane中丢失,即未交付给父级,这是一个尚未修复的旧错误: 因此,我使用了变通方法,通过使用临时侦听器捕获JScrollPane中的事件,然后将事件分派给它,让它成为一个真正的侦听器处理的父对象 private class DispatchListener extends MouseAdapter { @Override public void mousePressed (MouseEvent me) {
MouseEvent
在JScrollPane
中丢失,即未交付给父级,这是一个尚未修复的旧错误:
因此,我使用了变通方法,通过使用临时侦听器捕获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);
}
}
它工作正常,但是使用Java7的人开始抱怨鼠标点击在应用程序中没有反应。在降级到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;
我不知道为什么要这样实施?这是另一个bug还是功能?
似乎我需要创建自己的对象,而无需调用
SwingUtilities.convertMouseEvent
和sourceEvent中的set按钮。这是一个有趣的问题。在SwingUtilities.convertMouseEvent
中使用MouseEvent.NOBUTTON
确实看起来很奇怪。然而,我无法用Java7重现这个问题;对我来说,转换鼠标事件的按钮
字段对于Java 7和6是正确的(在Windows 7笔记本电脑上使用1.7.0-b147 64位和1.6.0_21-b07 64位)
通过MouseEvent
构造函数进行调试,我看到当按钮
字段最初设置为零时,构造函数末尾对setNewModifiers
的调用会根据modifiers
字段更改按钮
(在SwingUtilities.convertMouseEvent
中构造转换的鼠标事件时,从sourceEvent.getModifiers
接收其值)
通过单击转换的鼠标事件如下所示(对于Java 7):
回答您的问题:我认为MouseEvent.NOBUTTON
被传递给MouseEvent
构造函数,因为按钮
字段的值将由修饰符
字段的值决定。在我的笔记本电脑上,Java 7和6的工作方式与我预期的一样,因此它没有工作在我看来,这是一个bug。您的应用程序是否在浏览器中运行?这是否会影响鼠标事件的转换方式?您是否已经创建了解决问题的解决方案,或者您是否可以共享一些小程序代码
其他事件类型
SwingUtilities.ConvertMouseeEvent
处理的前两种情况创建一个MouseWheelEvent
或一个MenuFragmouseEvent
对象。两个构造函数(最终)都使用MouseeEvent.NOBUTTON
参数调用MouseeEvent
构造函数。(查看这些事件(无需转换)在我的笔记本电脑上,mouseweelevent
的按钮
字段始终为零(我的鼠标只有一个轮子).对于menudrampuseevent
对象,按钮
等于menudrampusereleased
事件的1,否则为零,而修饰符
字段始终等于按钮1\u掩码
)所以它看起来像是MouseEvent.NOBUTTON
作为MouseEvent
构造函数的参数非常流行。请看-看起来convertMouseEvent()最近没有更改,所以其他代码更改必须对Java 7中看到的更改负责(我可以在这里用1.7.0Ø21重现这个问题)
无论如何,这个问题似乎已经在Java 8中解决了。这个问题只适用于有三个以上按钮的鼠标,不是吗,这个问题已经在这里解决了,嗯,你必须通过@camickr:-)@mKorbel,
点p=SwingUtilities.convertPoint(pane.getViewport(),me.getPoint(),tablePanel)搜索被否决的帖子;MouseEvent newMe=newmouseevent(tablePanel,me.getID(),me.getWhen(),me.getModifiers(),p.x,p.y,me.getXOnScreen(),me.getYOnScreen(),me.getClickCount(),me.isPopupTrigger(),me.getButton())代码>解决了问题,但问题仍然存在:为什么?大便发生了…;-)你可以考虑在浮标的bug游行中提出一个问题。
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=]