これは私を夢中にさせています。非常に単純な問題に違いないのですが、私には見えません。
基本的に、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 マシンに戻ると、動作し始めました。ラップトップを再起動するだけで、何もしませんでした。問題を再現することも追跡することもできませんでしたが、もう一度問題が発生して何かを見つけることができたら戻ってきます.