2012-02-24 5 views
1

gui의 버튼을 눌렀을 때 프로그램을 중단 시키려고합니다.if 문이 while (true) 루프에서 실행되지 않습니다.

GUI 스레드를 시작하는 스레드가 있고 적용 단추가 눌러 질 때까지 대기합니다. 다음은 코드입니다 :

public void run() {  

     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      }   
     }); 

     // Wait until apply button clicked and set team 
     while(true) { 

      applyClicked = gui.getApplyClicked(); 
      if (applyClicked == true) { 
       teamYellow = gui.getTeam(); 
       break; 
      } 
     } 

그러나 심지어 내가 적용을 클릭하고 applyClicked는 그 if 문을 실행하지 않는 GUI 내에서 진정한된다.

그러나 실제로 인쇄 할 때 아래에 인쇄 줄을 추가하면 정상적으로 작동합니다.

또한 한 줄씩 실행하면서 변수를 올바르게 디버깅하여 작동합니다.

왜 내가 println을 가지고 있지 않을 때이 기능이 작동하지 않습니까? 스레드와 관련이 있습니까?

감사

+6

'휘발성'? (또한, 바쁜 대기 루프, 나쁜!) –

+0

휘발성 일했습니다. 어떻게하면 GUI에서 대기 루프가없는 루프가 포함 된 클래스로 부울을 가져올 수 있습니까? – sam

답변

5

당신은 busy-wait 루프를 실행하고 있는데, 이것은 당신의 CPU 전원을 모두 소비한다고 생각합니다. 대신 적용 버튼에 actionListener를 추가하고 actionPerformed 메서드에서 처리해야합니다.

+0

안녕하세요, 내가 GUI 클래스에서 현재하고있는 것은 무엇입니까. actionPerformed 메소드는 버튼이 클릭되었는지 여부를 나타내는 boolean을 변경합니다. 그런 다음 같은 클래스의 getter를 사용하여 위의 루프가 포함 된 클래스에이 부울을 가져옵니다. – sam

+0

이 클래스를 buttons 이벤트의 리스너로 추가 할 수 없습니까? 그런 다음에는 원하지 않는 busy-wait 루프를 제거 할 수 있습니다. –

+0

죄송합니다. 어떻게해야할지 모르겠습니다. 그래서 현재 busy-wait 루프를 가진 클래스는 Runner라고 불리며, Gui 클래스는 MainGui라고 불리우며 Runner 클래스에 gui라는 인스턴스가 있습니다. 현재 내가 (새의 ActionListener() \t 공공 무효의 actionPerformed log.apply.addActionListener { 이 \t @Override (ActionEvent의 것들은 arg0) {이 ...'로그 버튼을 포함하는 패널입니다 MainGui 클래스 . 어떻게이 것'전화 Runner 클래스를 리스너로 추가합니다. – sam

0

이 정확히 찾고있는 해답이 될 수 있지만, applyClicked에 해당하는 경우 때문에, 단지의 경우, 루프 외부 applyClicked을 정의하고 휴식이 필요하지 않도록 while(!applyClicked)로 루프를 선언하지 않을 수 있습니다 루프는 자체적으로 종료됩니다. 그래도 문제가 해결되지 않으면 디버거로 새 코드를 실행하십시오. 이것은 효과가있을 수도 있고 효과가 없을 수도 있으며, 이는 단지 제안 일뿐입니다.

관련 문제