这让我疯了。它必须是一个非常简单的问题,但我不可能看到它。
基本上不会调用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机器时,它开始工作了。我做的只不过是重启我的笔记本电脑。我无法重现问题,也无法追踪它,但如果我再次找到它并设法找到某些东西,我会回来。
答案 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_ENTERED
,MOUSE_EXITED
,MOUSE_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鼠标时,我似乎遇到了这些问题。如果我将其关闭,事情就会恢复正常。我没有更详细地研究它 - 我已经有了另一只鼠标而是使用了那只。