java - UI 在 Debug模式下按预期更新,但在正常运行时不执行任何操作

标签 java swing debugging user-interface netbeans

我正在 NetBeans 中创建一个简单的回合制游戏。 GUI 初始化后,它调用函数 HerosTurn() 等待用户选择,并从单独的 Hero 类创建该选择的结果。当我在 Debug模式下单步执行代码时,我会得到正确的结果,但如果我只是运行代码,则不会将任何内容附加到文本区域,除非我让等待函数在等待输入时不断附加文本。我见过类似的其他问题,但它们都涉及多线程,我不相信这就是我正在做的事情。任何帮助将不胜感激。

这是主类:

package Flow;

import Forms.Battleinterface;


/**
 *
 * @author Steemo
 */
public class battle { 
    public static int hAct;
    public static int gLife = 200;

    public static void herosTurn() {
        hAct = 0;

        Forms.Battleinterface.biText.append("What will you do?");
        while (hAct == 0){
            // adding the line below makes code work but is ugly.
            //Forms.Battleinterface.biText.append(".");
            continue;
        }
        if (hAct == 1){
            Entities.Hero.attack();
        }
    }

    public static void main(String args[]) {
        Battleinterface battleinterface = new Forms.Battleinterface();
        Battleinterface.Start();
        while (gLife > 0) {
            herosTurn();
        }


    }
}

这是位于单独包中的 Hero() 类:

package Entities;

import java.util.Random;

/**
 *
 * @author Steemo
 */
public class Hero {
    static Random hGen = new Random(54154454);

    public static void attack() {
        int hAtt = 0;
        hAtt = hGen.nextInt(6) + 15;
        Forms.Battleinterface.biText.append("\nYou swing your axe and do " + hAtt
                + " Damage!!!");
    }

}

我没有附加用于生成 GUI(Battleinterface)的类,因为 GUI 生成得很好,唯一发生的其他事情是输入 hAct 的传递。 如果需要的话我可以附上。

最佳答案

替换此代码...

while (hAct == 0){
  continue;
}

...用这个代替:

while (hAct == 0){
  try {
    Thread.yield();
  } catch (InterruptedException interruptedEx) {
    // Log the interruption somewhere.
  }
}

假设您在某种程度上使用 AWT/Swing?这是一个无限循环,阻止其他线程运行。通过这样做,您永远不会让 UI 线程实际执行任何更新,这意味着它似乎挂起。您可能没有自己执行任何线程,但 AWT/Swing 内置了线程来执行各种功能,并且它们需要定期获取 CPU 时间来完成其工作。

这在调试中有效的原因是,当您单步执行 herosTurn 方法时,调试器会暂停该方法,从而允许 UI 线程进行更新(包括从用户获取输入),但当只是运行游戏时,herosTurn 方法永远不会暂停,并且该方法占用了应用 100% 的可用 CPU 时间。

最后,如Mike Clark提到过,你通常不应该编写带有无限循环的 UI。相反,您定义触发事件的组件。您的代码会收到这些事件的通知并做出适当的 react 。这就是所谓的 UI 事件模型。如果您使用的是 Swing,有关在事件模型中工作的介绍性信息 is covered here .

我通常也不会在游戏中使用 AWT/Swing,因为 UI 编码、渲染性能的复杂性,以及与 AWT/Swing 并不是为游戏而构建的良好工具相关的其他几个原因。话虽如此,如果您愿意深入研究 UI 代码来完成回合制游戏,那么除了我在 a previous answer 中概述的其他一些原因之外,回合制游戏也可以通过这种方式正常工作(因为渲染性能要求通常要低得多)。 .

关于java - UI 在 Debug模式下按预期更新,但在正常运行时不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689511/

相关文章:

java - 为什么 SetMinimumSize 设置最小高度而不是宽度?

java - 使用 JAXB 使用动态根元素解码 XML

java - 循环无法识别先前定义的变量

java - 在 Android 中使用资源会卡住主线程

Java GUI 不会显示我想要的提示

c++ - 在 C++ 中为迭代器编写运算符 == 函数

javascript - 如何在 Android(和 iOS)上查看 JavaScript 控制台?

c# - 我们可以在运行应用程序时编辑我们的代码吗

java - 图像调整大小以适应 JPanel

java - 在 JTextPane 中绘制水平线