Java SWING Остановка цикла через button

У меня есть форма, на форме 2 клавиши: пуск и старт. В коде есть цикл, который бесконечно имитирует перемещение курсора по указанным координатам в коде. Запуск цикла производится по кнопке старт, запускается, проблем нет, но пока цикл запущен, кнопка старт зажата, и нельзя нажать на стоп.
Приложу код, если там что то коряво не ругайтесь. Эту "фичу" пофиксить бы... ps "чекаю" сайт постоянно...

package GuiForm;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class MyForm {
    private JPanel panel1;
    private JButton buttonPlay;
    private JButton buttonStop;
    public boolean b = false;
public class Run implements Runnable{
    Thread t;
    Run(){
        t = new Thread();
        t.start();
    }
    public void run(){
        for(;;){
            try {
                Robot r = new Robot();
                r.mouseMove(350, 657);
                Thread.sleep(3000);   //сам цикл
                r.mouseMove(568, 369);
                Thread.sleep(3000);
                if(b)break;;
            }catch (Exception e){
                e.printStackTrace();
            }

        }
    }
}
    public MyForm() {


       panel1.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                super.keyTyped(e);
            }

            @Override
            public void keyPressed(KeyEvent e) {



            }

            @Override
            public void keyReleased(KeyEvent e) {
                super.keyReleased(e);
            }
        });

        buttonStop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                    JOptionPane.showMessageDialog(null, "Программа остановилась!");
                b = false; //стоп цикл
            }
        });
        buttonPlay.addActionListener(new ActionListener()  {
            @Override
            public void actionPerformed(ActionEvent e)  {

Run r = new Run(); //запуск цикла
r.run();
                JOptionPane.showMessageDialog(null, "Программа запустилась!");
            }
        });
    }

    public static void main(String args[]){

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new MyForm().panel1);
                frame.pack();
                frame.setSize(100,100);
            }
        });

    }

}



Ответы (1 шт):

Автор решения: Олексій Моренець

Для начала уберите r.run();, т.к. ваш поток уже запустился с помощью t.start(); В конструктор Thread() Вы должны передать ваш Runnable, т.е. this в вашем случае - t = new Thread(this);.

→ Ссылка