Не могу остановить цикл с помощью кнопки - PullRequest
1 голос
/ 16 сентября 2010

Я пытаюсь написать программу, которая перемещает мышь каждые 3 минуты (чтобы остановить включение заставки), но я хочу иметь возможность остановить и запустить ее по желанию. Как вы можете видеть ниже, я создал кнопки и метод, но когда вы щелкнете по нему, запустите его, перейдя в цикл while, и, по сути, это бесконечный цикл, он не будет смотреть и видеть, нажали ли вы кнопку завершения.

Я пытался system.exit (0) при нажатии на кнопку завершения, при этом кнопка завершения передавалась в ложь методу run (), и, как вы можете видеть из кода, я пробовал оператор if в цикле while для посмотрим, если это заметит меня!

Любая помощь будет принята с благодарностью!

Код:

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test 
{
boolean loop;
static boolean exit;

public static void main(String[] args) throws AWTException
{
    System.out.println("before");
    makeButtons();
    System.out.println("after");
}

public static void makeButtons()
{
    JFrame jfrMain = new JFrame ("Mouse Robot");
    JPanel jplMain = new JPanel();
    final JButton run = new JButton("Run");
    final JButton end = new JButton("End");

    run.setEnabled(true);
    end.setEnabled(true);

    run.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            //run.setEnabled(false);
            //end.setEnabled(true);
            try {
                run(true);
            } catch (AWTException e1) 
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    });

    end.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            exit = true;
        }
    });

    jplMain.setLayout(new FlowLayout());
    jplMain.add(run);
    jplMain.add(end);

    jfrMain.getContentPane().add(jplMain, BorderLayout.CENTER);
    jfrMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jfrMain.pack();
    jfrMain.setVisible(true);

    }   

public static void run(boolean loop) throws AWTException
{
    Robot r2d2 = new Robot();

    while(loop)
    {

        System.out.println("1");
        Point mousePoint = MouseInfo.getPointerInfo().getLocation();
        mousePoint.translate(0, 1);
        r2d2.mouseMove(mousePoint.x, mousePoint.y);
        r2d2.delay(60000);
        //r2d2.delay(60000);
        //r2d2.delay(60000);
        System.out.println("2");
        mousePoint = MouseInfo.getPointerInfo().getLocation();
        mousePoint.translate(0, -1);
        r2d2.mouseMove(mousePoint.x, mousePoint.y);
        r2d2.delay(60000);
        //r2d2.delay(60000);
        //r2d2.delay(60000);
        System.out.println("looping");
        if (exit = true)
        {
            break;
        }
    }
}

}

Ответы [ 5 ]

1 голос
/ 16 сентября 2010

Ну, сначала исправьте условие для выхода, т.е. сделайте его exit == true, как упомянуто в первом ответе.

Во-вторых, я не думаю, что даже это решит вашу проблему, потому что вы делаете бесконечный цикл в actionPerformed, который вызывается EDT (Even Dispatch Thread), и это вообще останавливает обработку событий. Поэтому вместо этого запустите новый поток внутри метода actionPerformed, который перемещает мышь. Сохраните ссылку на этот поток, чтобы вы могли остановить / прервать поток или задать условие выхода, чтобы остановить поток.

Дайте мне знать, если вам нужен пример кода для этого.

1 голос
/ 16 сентября 2010

Попробуйте

if (exit == true)
{
   break;
}
0 голосов
/ 16 сентября 2010

прежде всего сделайте это exit == true;

вместо использования exit = true; вы можете использовать loop = false.

Тем не менее, он не остановится во время цикла, как только вы нажмете на конецкнопка.Чтобы остановить его сразу после нажатия кнопки, вы должны использовать две разные темы.1. Обработка ваших событий.2. другой, запускающий цикл while.

В потоке обработки событий необходимо поддерживать объект потока while, с помощью которого вы можете установить соответствующее значение переменной loop или exit, чтобы остановить цикл.

0 голосов
/ 16 сентября 2010

У меня есть некоторые сомнения по поводу этой разработки, хотя я еще не попробовал.Разве Java не будет работать, даже не слушая мышь, которая закончится бесконечным циклом?

Я думаю, это должен быть некий эквивалент функции javascript setInterval() для перемещения мыши и clearInterval()после нажатия кнопки.

0 голосов
/ 16 сентября 2010

if (exit == true) {break;}

...