【问题标题】:if statement not executing in while(true) loop [duplicate]if语句未在while(true)循环中执行[重复]
【发布时间】:2012-02-24 18:18:59
【问题描述】:

我试图让我的程序在按下 gui 上的按钮时跳出 while 循环。

我有一个线程启动 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;
            }   
        }

但是,即使我单击应用并且在 GUI 中 applyClicked 变为真,它也不会执行该 if 语句。

但是,如果我在 while true 下方添加一个打印行,它可以正常工作。

我还逐行调试它,变量设置正确,它可以工作。

当我没有 println 时,为什么这不起作用?跟线程有关系吗?

谢谢

【问题讨论】:

  • volatile? (另外,忙等待循环,不好!)
  • volatile 工作。在没有繁忙的等待循环的情况下,我如何从 gui 获取包含该循环的类的布尔值?

标签: java swing loops


【解决方案1】:

您正在执行一个忙等待循环,我猜这会占用您所有的 CPU 功率。 你应该在你的应用按钮上添加一个 actionListener 并在 actionPerformed 方法中做你的事情。

【讨论】:

  • 嗨,这就是我目前在 gui 课上所做的。 actionPerformed 方法改变了表示按钮是否被点击的布尔值。然后我在同一个类中使用一个 getter 在我的类中获取这个布尔值,其中包含上面的循环。
  • 您不能将此类添加为按钮事件的侦听器吗?然后你可以删除你肯定不想拥有的忙等待循环。
  • 抱歉,不太清楚该怎么做。因此,当前具有忙等待循环的类称为 Runner,而 gui 类称为 MainGui,其实例在 Runner 类中称为 gui。目前我在 MainGui 类中调用 log.apply.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) {...,其中 log 是包含按钮的面板。我如何将 Runner 类添加为侦听器
  • public class Runner implements ActionListener { public void actionPerformed(ActionEvent e) { do stuff in here } 然后您可以将Runner 作为参数添加到 MainGui 构造函数中,并在构造函数中执行 public MainGui(Runner runner) { log.apply.addActionListener(runner); }
  • 您能否更新问题中的代码示例?然后我可能会看到有什么问题。
【解决方案2】:

这可能不是您正在寻找的确切答案,但以防万一,在循环外定义 applyClicked 并将循环声明为 while(!applyClicked) 以便不需要中断,因为如果 applyClicked 为真,循环将自行退出。如果这仍然不起作用,请使用调试器运行新代码。这可能有效,也可能无效,这只是一个建议。

【讨论】:

    猜你喜欢
    • 2015-09-26
    • 2021-04-25
    • 2020-08-08
    • 2021-04-15
    • 2015-05-19
    • 1970-01-01
    • 2015-12-28
    • 2019-02-17
    • 1970-01-01
    相关资源
    最近更新 更多