2

マウスの位置を報告し、マウスがクリックされるまで、マウスクリックでループを開始したいと考えています。ループを開始して位置を報告するのに問題はありませんでしたが、マウスが 2 回クリックされた場合、またはマウスが 2 回クリックされた場合に MouseClicked メソッドがループを終了しても、プログラムはループを無限に続けます。

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++;
            }               
        }   
    });
4

2 に答える 2

4

EDT で無限ループが発生しています (これがリスナーを呼び出します)。つまり、Swing はこれ以上イベントを処理できません。これは、mouseClicked が再び呼び出されないことを意味します。これが、numClicked がインクリメントされていない理由です。

別のスレッドで無限ループをスピンオフし、EDT で numClicked のみをインクリメントする必要があります。次に、numClicked を揮発性にするか、さらに良いことに、AtomicInteger にする必要があります。

于 2012-05-05T03:55:59.397 に答える