2010-09-16 13 views
1

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

Я попытался system.exit (0) щелкнуть по кнопке конца, имея конечную кнопку передать false в метод run(), и, как вы можете видеть из кода, ive попробовал оператор 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; 
     } 
    } 
} 

} 
+1

Из любопытства: почему бы не отключить экранную заставку? – gpeche

ответ

1

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

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

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

+0

пример будет fab. Я делал темы в прошлом году для своих экзаменов, но один раз экзамен закончился * woosh * все его прошло: P – Katie

1

Попробуйте

if (exit == true) 
{ 
    break; 
} 
+3

или просто: 'if (exit) {break;}' – dogbane

+0

... '(exit = true) == true' - здесь * есть проблема здесь, но он не несет ответственности за цикл« бесконечный »(хотя я догадка, бесконечность <120 секунд в этом случае ;-)) –

+0

Здравствуйте.Я не могу отключить скринсейвер, так как это будет работать на тонком клиенте sunray, который автоматически активирует экран после 5 или около того минут бездействия, чтобы попытаться спасти планету и весь этот джаз. Ive wracked мои мозги и прошел через все настройки и theres ничего я могу сделать на нем. Это решение не работает :(Спасибо за вашу помощь! – Katie

0

если (выход == TRUE) { перерыв; }

+0

hehe rooky error с моей стороны! Все еще не работает :( – Katie

+0

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

0

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

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

0

первую очередь сделать это exit == true;

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

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

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

Смежные вопросы