2012-02-24 50 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是真实的,循环将自行退出。如果仍然无效,请使用调试器运行新代码。这可能会或可能不会工作,这只是一个建议。