java - SwingUtilities.convert Mouse Event() 在 Java 7 中将按钮设置为 BUTTON

标签 java swing applet jscrollpane swingutilities

据我们所知,MouseEventJScrollPane 中丢失了,即没有传递给父级,这是一个尚未修复的旧错误: 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 后问题得到解决,但现在我正在测试 AppletChrome 迫使我将插件升级到版本 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 构造函数。 (在我的笔记本电脑上查看这些事件(没有转换),MouseWheelEventbutton 字段始终为零(我的鼠标只有一个滚轮)。对于 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/

相关文章:

java - 无论文本大小如何,始终在 JButton 内显示文本

java - 如何设置jpanel的高度和宽度

java - 鼠标悬停 - 在屏幕上显示消息 Java 应用程序

java - 使用 g.drawString 显示新行

Java 小程序,其中包含多个子文件夹中的文件

java - Oozie 抛出 java.lang.ClassNotFoundException

java - 使用java IO复制的大小是不同的

Java - 无法读取 ØÖ(特殊字符)并打印它

java - 检索 ResultSet 中的条目数

java - 我应该如何编辑 jar 的 list ?