2012-05-05 74 views
2

我想要一個鼠標點擊開始一個循環,報告鼠標的位置,直到點擊鼠標。我沒有問題開始循環和報告位置,但即使MouseClicked方法結束循環,如果鼠標單擊兩次或應該,程序會無限地繼續循環。使用MouseListener開始或結束一個無限循環

public JFramethingy() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.addMouseListener(new MouseAdapter() { 
     int numClicked; 
     public void mouseClicked(MouseEvent arg0) { 
      numClicked++; 
      for (int i = 0; i > -1;) { 
       if(i % 1002000 == 0){ 
       PointerInfo a = MouseInfo.getPointerInfo(); 
       Point b = a.getLocation(); 
       int x = (int) b.getX(); 
       int y = (int) b.getY(); 
       System.out.println(x + "," + y); 


       } 
       if (numClicked > 1){ 
        numClicked = 0; 
        i = -3; 
       } 
       i++; 
      }    
     } 
    }); 
+0

當您第一次點擊鼠標並調用mouseClicked()方法時,它將保持無限循環並永不返回。這意味着任何其他事件,包括進一步的鼠標點擊將永遠不會被處理,因此您的mouseClicked()將永遠不會再被調用。 –

回答

4

你的無限循環是發生在美國東部時間(這就是調用監聽器),這意味着搖擺無法處理任何更多的事件。這意味着mouseClicked不會再被調用,這就是爲什麼numClicked不會被增加的原因。

您需要在單獨的線程中關閉無限循環,並讓EDT僅增量numClicked。然後你需要做numClicked volatile,或者更好的做一個AtomicInteger。

3

不,不需要創建後臺線程直接,因爲您可以通過使用Swing Timer或javax.swing.Timer輕鬆解決此問題,因爲這僅僅是其構建的情況。