2012-12-17 53 views
0

我嘗試做一些很酷的「鼠標跟蹤器」。它記錄你的鼠標位置,直到你按下「跟蹤」按鈕,當你點擊它時,它「恢復」鼠標位置。爲什麼我的程序不能處理鼠標移動? (Java)

它似乎不處理mouseMove方法。爲什麼?

import java.awt.AWTException; 
import java.awt.Dimension; 
import java.awt.Point; 
import java.awt.Robot; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 


public class Mouse implements MouseMotionListener { 
    JFrame frame = new JFrame(); 
    JButton move = new JButton("Track"); 
    Point[] points = new Point[100000]; 
    int i = 0; 


    public Mouse() { 
     // restore on track 
     move.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       try { 
        Mouse.this.restore(); 
       } catch (InterruptedException | AWTException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     }); 
     // initialize component 
     frame.setPreferredSize(new Dimension(300, 300)); 
     frame.getContentPane().add(move); 
     frame.addMouseMotionListener(this); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    @Override 
    public void mouseDragged(MouseEvent e) {} 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     System.out.println("Mouve move"); 
     if(i < 100000) { 
      points[i] = e.getLocationOnScreen(); 
      i++; 
     } 
    } 

    public void restore() throws InterruptedException, AWTException { 
     System.out.println("Mouse restored"); 
     for(int j = 0; j < i; j++) { 
      Robot r = new Robot(); 
      r.mouseMove(points[j].x, points[j].y); 
      Thread.sleep(100); 
     } 
    } 

    public static void main(String[] args) { 
     Mouse s = new Mouse(); 
    } 

} 
+0

所以你按下按鈕後,到底發生了什麼? '我'的價值是多少,它是> 0?在'for'循環之外創建'Robot'。 –

回答

1
  1. 添加MouseListenerJFrame或其ContentPane,不JButton - 使用SwingUtilities.invokeLater()
  2. 在EDT線程主要原因
  3. 運行的Swing從JFrame中刪除mouseMotionListener當你調用restore
  4. 認沽在循環外創建機器人

for(int j = 0; j < i; j++) { 
    Robot r = new Robot(); 

Robot r = new Robot(); 
for(int j = 0; j < i; j++) { 
+0

謝謝你,它的工作原理。但如何做第3步? – Billie

+0

@ user1798362,frame.removeMouseMotionListener(this); http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Component.html#removeMouseMotionListener(java.awt.event.MouseMotionListener) –

相關問題