Java(Swing):MouseMoved根本不工作

时间:2013-03-11 00:55:51

标签: java swing mouselistener

这让我疯了。它必须是一个非常简单的问题,但我不可能看到它。

基本上不会调用mouseMoved。下面是代码。

public class MouseMotionThing {
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            JFrame jFrame = new JFrame();
            jFrame.setContentPane(new ContentPane());
            jFrame.setSize(400, 400);
            jFrame.setVisible(true);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }); 
}
}

我的小组。此实现使用MouseInputListener:

class ContentPane extends JPanel implements MouseInputListener {
int x = 0, y = 0;

public ContentPane() {
    setOpaque(true);
    addMouseListener(this);
    addMouseMotionListener(this);

}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.drawLine(0, 0, x, y);
}

@Override
public void mouseDragged(MouseEvent e) {
    System.out.println("Mouse Dragged!");
}

@Override
public void mouseMoved(MouseEvent e) {
    System.out.println("CALLED MOUSE MOVED");
    x = e.getX();
    y = e.getY();

    repaint();
}

@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}
}

而这个替代实现仅使用MouseMotionListener:

class ContentPane extends JPanel implements MouseMotionListener {
int x = 0, y = 0;

public ContentPane() {
    setOpaque(true);
    addMouseMotionListener(this);

}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.drawLine(0, 0, x, y);
}

@Override
public void mouseDragged(MouseEvent e) {
    System.out.println("Mouse Dragged!");
}

@Override
public void mouseMoved(MouseEvent e) {
    System.out.println("CALLED MOUSE MOVED");
    x = e.getX();
    y = e.getY();

    repaint();
}
}

在上述任何一种替代实现中,都没有调用mouseMoved EVER。我每次都会添加正确的听众,但它根本不起作用。 mouseDragged工作正常。我错过了什么?

LE:我测试了Ubuntu 12.10&的代码。 JDK 7,运行良好。然后,当我回到我的W8机器时,它开始工作了。我做的只不过是重启我的笔记本电脑。我无法重现问题,也无法追踪它,但如果我再次找到它并设法找到某些东西,我会回来。

3 个答案:

答案 0 :(得分:2)

目前尚不清楚事情可能出错的地方;完成构建可能会有所帮助。作为参考,我已重新考虑您的sscce使用MouseAdapter并从this中删除泄漏的JPanel

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MouseMotionThing {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame jFrame = new JFrame();
                jFrame.add(new MousePanel());
                jFrame.pack();
                jFrame.setSize(400, 400);
                jFrame.setVisible(true);
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }

    private static class MousePanel extends JPanel {

        Point p = new Point();

        public MousePanel() {
            setOpaque(true);
            addMouseMotionListener(new MouseHandler());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawLine(0, 0, p.x, p.y);
        }

        private class MouseHandler extends MouseAdapter {

            @Override
            public void mouseDragged(MouseEvent e) {
                update(e);
            }

            @Override
            public void mouseMoved(MouseEvent e) {
                update(e);
            }

            private void update(MouseEvent e) {
                System.out.println(e.paramString());
                MousePanel.this.p = e.getPoint();
                MousePanel.this.repaint();
            }
        }
    }
}

答案 1 :(得分:1)

我碰巧在我所贡献的其中一个应用程序中遇到了类似的问题。我无法找到任何指向根本原因的内容,因此我开始进行一些Java AWT日志记录,如Oracle Logging Overview页面所示。​​

在分析了部分文件后,我发现有5个鼠标按钮被注册到JVM:

<record>
    <date>2015-06-18T15:45:54</date>
    <millis>1434656754395</millis>
    <sequence>70</sequence>
    <logger>sun.awt.windows.WDesktopProperties</logger>
    <level>FINE</level>
    <class>sun.awt.windows.WDesktopProperties</class>
    <method>setIntegerProperty</method>
    <thread>1</thread>
    <message>awt.mouse.numButtons=5</message>
</record>

我也意识到其他鼠标事件(MOUSE_ENTEREDMOUSE_EXITEDMOUSE_DRAGGED)的extModifiers值为Button5,这很奇怪因为我是只需使用触摸板,没有按下其他按钮。我不确定这是否会阻止MOUSE_MOVED事件被解雇 - 我猜这会对较低级别的Java进行一些研究。

<record>
    <date>2015-06-18T15:45:55</date>
    <millis>1434656755026</millis>
    <sequence>329</sequence>
    <logger>java.awt.event.EventDispatchThread</logger>
    <level>FINEST</level>
    <class>java.awt.EventDispatchThread</class>
    <method>pumpOneEventForFilters</method>
    <thread>13</thread>
    <message>Dispatching: java.awt.event.MouseEvent[MOUSE_ENTERED,(388,387),absolute(388,387),button=0,extModifiers=Button5,clickCount=0] on frame0</message>
</record>

我对额外的鼠标按钮进行了一些研究,发现了另一个关于Desktop Properties的Oracle页面。我更改了Java的启动参数以包含-Dsun.awt.enableExtraMouseButtons=false,瞧,我的应用程序再次开始工作。

我测试了一个非常简单的Java应用程序,在各种Windows JRE上监听MOUSE_MOVED,并且在没有设置此参数时它们都表现出相同的问题。

如果您的应用程序中没有使用额外的鼠标按钮,那么这可能是一种解决方法。

答案 2 :(得分:0)

好吧,当我在Windows 8上使用A4TECH G10-770F鼠标时,我似乎遇到了这些问题。如果我将其关闭,事情就会恢复正常。我没有更详细地研究它 - 我已经有了另一只鼠标而是使用了那只。