2012-02-24 49 views
1

我試圖讓我的程序在按下gui上的按鈕時跳出while循環。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在GUI中爲真不執行該if語句。

但是,如果我在下面添加一條打印線,那麼它的工作正常。

我也調試它一行一行地運行,變量設置正確,它的工作原理。

爲什麼在我沒有println時不工作?這與線程有關嗎?

感謝

+6

'volatile'? (也是,忙等待循環,不好!) – 2012-02-24 18:30:35

+0

揮發工作。如果沒有一個繁忙的等待循環,我怎麼會從gui中得到布爾值到包含該循環的類? – sam 2012-02-24 20:47:47

回答

5

你正在執行一個忙等待循環,我猜你會佔用你所有的cpu能力。 您應該在應用按鈕上添加一個actionListener,並在actionPerformed方法中執行您的操作。

+0

嗨多數民衆贊成在我目前正在做的貴班。 actionPerformed方法改變了表示按鈕是否被點擊的布爾值。然後我在同一個類中使用getter來獲得包含上面循環的類中的這個布爾值。 – sam 2012-02-24 20:44:26

+0

難道你不能把這個類作爲一個監聽器添加到按鈕事件中嗎?然後你可以刪除你肯定不想擁有的忙等待循環。 – 2012-02-24 20:49:21

+0

抱歉不太確定該怎麼做。所以目前擁有busy-wait循環的類被稱爲Runner,而Gui類在Runner類中被稱爲MainGui,其實例名爲gui。目前,我稱之爲'log.apply.addActionListener(新的ActionListener(){ \t @覆蓋 \t公共無效的actionPerformed(ActionEvent的爲arg0){...' 在MainGui類,其中log是包含按鈕的面板。如何將我將runner類添加爲一個監聽器 – sam 2012-02-24 21:04:41

0

這可能不是你正在尋找確切的答案,但爲了以防萬一,定義applyClicked外循環並聲明環路while(!applyClicked),這樣不需要休息,因爲如果applyClicked是真實的,循環將自行退出。如果仍然無效,請使用調試器運行新代碼。這可能會或可能不會工作,這只是一個建議。