3

これは私を夢中にさせています。非常に単純な問題に違いないのですが、私には見えません。

基本的に、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 が呼び出されることはありません。毎回適切なリスナーを追加していますが、うまくいきません。ただし、 mouseDragged は正常に動作します。私は何が欠けていますか?

LE: Ubuntu 12.10 と JDK 7 でコードをテストしましたが、問題なく動作しました。その後、W8 マシンに戻ると、動作し始めました。ラップトップを再起動するだけで、何もしませんでした。問題を再現することも追跡することもできませんでしたが、もう一度問題が発生して何かを見つけることができたら戻ってきます.

4

3 に答える 3

2

どこでうまくいかなかったのかは明らかではありません。完全なビルドを行うと役立つ場合があります。参考までに、sscceをリファクタリングして を使用し、からのMouseAdapterリークを削除しました。thisJPanel

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();
            }
        }
    }
}
于 2013-03-11T01:21:05.150 に答える
0

Windows 8 で A4TECH G10-770F マウスを使用したときに、これらの問題が発生したようです。オフにすると、正常に戻りました。私はそれを詳しく調べませんでしたが、すでに別のマウスを持っていて、代わりにそれを使用しました.

于 2013-10-06T23:46:51.067 に答える