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=]