2014-09-15 2 views
0

로봇 클래스에서 mouseMove의 무한 루프를 만들기 위해 클릭하자 마자 원하는 jbutton이 있습니다. 그런 다음 다시 클릭하면 중지됩니다. 문제는 내 코드에서 처음으로 누를 때 시스템이 멈추고 다시 클릭 할 때 아무런 문제가 발생하지 않습니다. 나는 다음을 사용한다 :Robot 클래스, 무한 루프의 mouseMove

boolean go = false 

    jb.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      go = !go; 
      if (go) 
       jb.setText("Stop!"); 
      else 
       jb.setText("Start!"); 
      try { 
       Robot robot = new Robot(); 
       while (go) { 
        robot.mouseMove(500, 500); 
        robot.delay(1000); 
        robot.mouseMove(500, 400); 
       } 
      } catch (AWTException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    }); 
+0

시작해야 할 것입니다 : //docs.oracle.com/javase/tutorial/uiswing/concurrency/) 및 [Worker Threads and SwingWorker] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)를 참조하십시오. – MadProgrammer

답변

2

스윙은 단일 스레드 환경이다. 즉,이 스레드를 차단해야하는 항목이 있으면 스윙은 페인트 요청을 포함하여 새 이벤트에 응답 할 수 없으므로 UI가 고정되어있는 것처럼 보입니다. 이유는 ...

Concurrency in Swing

가장 간단한 해결책은 ... 당신이 수행하고자하는 작업을 HANDELS Runnable를 작성하여 ...

시작을 새로운 스레드를 생성하고 그 안에 루프를 실행할 수 있습니다

public class MouseRunner implements Runnable { 

    @Override 
    public void run() { 
     try { 
      Robot robot = new Robot(); 
      while (go) { 
       robot.mouseMove(500, 500); 
       robot.delay(1000); 
       robot.mouseMove(500, 400); 
      } 
     } catch (AWTException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
    } 
} 

그런 다음 사용자 f IRST 버튼을 클릭,

jb.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     go = !go; 
     if (go) { 
      jb.setText("Stop!"); 
      Thread t = new Thread(new MouseRunner()); 
      t.start(); 
     } else { 
      jb.setText("Start!"); 
     } 
    } 
}); 

조심 ... Thread를 만들고 시작, 당신의 go 변수 가능성이 HTTP [스윙의 동시성 (한 번 봐 복용에 의해 volatile