Использование MouseListener для начала или окончания бесконечного цикла

2

Я хочу, чтобы mouseclick начинал цикл, который сообщает местоположение мыши и до щелчка мыши. У меня не возникло проблем с запуском цикла и сообщением о местоположении, но даже при том, что метод 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++;
            }               
        }   
    });
  • 0
    Когда вы щелкаете мышью в первый раз и вызывается метод mouseClicked (), он будет бесконечно повторяться и никогда не вернется. Это означает, что любые другие события, включая дальнейшие щелчки мышью, никогда не будут обрабатываться, и, следовательно, ваш mouseClicked () никогда не будет вызываться снова.
Теги:
swing
awt
jframe

2 ответа

4

Ваш бесконечный цикл происходит на EDT (это то, что вызывает слушателей), что означает, что Swing не может обработать больше событий. Это означает, что mouseClicked снова не будет вызван, поэтому numClicked не увеличивается.

Вам нужно открутить бесконечный цикл в отдельном потоке, а EDT - только увеличивать numClicked. Затем вам нужно сделать numClicked volatile или, еще лучше, AtomicInteger.

3

Нет, нет необходимости создавать фоновый поток напрямую, так как вы можете легко решить эту проблему с помощью таймера Swing или javax.swing.Timer, поскольку это только та ситуация, для которой он был создан.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню