2012-05-05 11 views
2

マウスの位置を報告するループを開始し、マウスがクリックされるまでループを開始したい。ループを開始して場所を報告するのに問題はありませんでしたが、マウスが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

あなたの無限ループは、Swingは、任意のより多くのイベントを処理できないことを意味し、(それがリスナーを起動するものです)EDT上で起こっています。つまり、mouseClickedが再び呼び出されることはないため、numClickedが増分されていません。

別のスレッドで無限ループをオフにし、EDTのみの増分をnumClickedにする必要があります。次に、numClickedをvolatile、またはそれよりも良いAtomicIntegerにする必要があります。

3

いいえ、これはそれがために建てられた状況のほんの一種であるとして、あなたは簡単にスイングタイマーやのjavax.swing.Timerを使用してこれを解決することができるようにバックグラウンドスレッドを直接を作成する必要はありません。

関連する問題