Java UI在调试模式下按预期更新,但在正常运行时不执行任何操作

Java UI在调试模式下按预期更新,但在正常运行时不执行任何操作,java,swing,debugging,user-interface,netbeans,Java,Swing,Debugging,User Interface,Netbeans,我正在用NetBeans创建一个简单的基于回合的游戏。初始化GUI后,它调用函数herostrn(),等待用户选择,并从单独的类Hero创建该选择的结果。当我在调试模式下单步执行代码时,我得到了正确的结果,但是如果我只是运行代码,则不会向文本区域追加任何内容,除非我使用wait函数在等待输入时不断追加文本。我见过其他类似的问题,但它们都涉及多线程,我不相信这就是我正在做的。任何帮助都将不胜感激 这是主要课程: package Flow; import Forms.Battleinterface

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

这是主要课程:

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的传递。
如果需要,我可以附加它。

嗯,将文本缓冲区刷新到文本区域可能会出现问题。尝试在每次打印后显式刷新文本缓冲区,看看这是否会产生影响。

嗯,将文本缓冲区刷新到文本区域可能会出现问题。尝试在每次打印后显式刷新文本缓冲区,看看这是否会产生影响。

在我看来,您的程序在方法
herostrn()
中陷入了while循环,只要该函数没有返回,如果您将此游戏编程为单线程应用程序,则不会更新任何内容

当您取消对
Forms.Battleinterface.biText.append(“.”)的注释时,它会起作用行,然后每次迭代都向GUI发送一个信号,从而使其更新


游戏通常有一个主游戏循环,从中控制程序的所有元素。也许改变你的实现策略会有所帮助?

在我看来,你的程序在方法
herostrn()
中陷入了一个while循环,只要该函数没有返回,如果你将这个游戏作为一个单线程应用程序进行编程,就不会有任何更新

当您取消对
Forms.Battleinterface.biText.append(“.”)的注释时,它会起作用行,然后每次迭代都向GUI发送一个信号,从而使其更新

游戏通常有一个主游戏循环,从中控制程序的所有元素。也许更改您的实施策略会有所帮助?

替换此代码

while (hAct == 0){
  continue;
}
…取而代之的是:

while (hAct == 0){
  try {
    Thread.yield();
  } catch (InterruptedException interruptedEx) {
    // Log the interruption somewhere.
  }
}
假设您在某种程度上使用AWT/Swing?这是一个无限循环,阻止其他线程运行。通过这样做,您永远不会让UI线程实际执行任何更新,这意味着它似乎挂起。您可能无法自己执行任何线程,但AWT/Swing附带了内置的线程来执行各种功能,它们需要定期获得CPU时间来完成工作

这在调试中起作用的原因是,调试器在您单步执行时暂停了
herostrn
方法,允许UI线程进行更新(包括从用户处获取输入),但在运行游戏时,
herostrn
方法从不暂停,这种方法占用了应用程序100%的可用CPU时间

最后,正如前面提到的,您通常不应该使用无限循环编写UI。而是定义触发事件的组件。您的代码将收到这些事件的通知并做出相应的反应。这就是所谓的UI事件模型。如果您使用的是Swing,请参阅有关在事件模型中工作的介绍性信息

我通常也不会在游戏中使用AWT/Swing,因为UI编码、渲染性能的复杂性,以及与AWT/Swing不是游戏的好工具这一事实相关的其他几个原因。话虽如此,基于回合的游戏可以通过这种方式很好地工作(因为渲染性能要求通常要低得多),如果您愿意深入研究UI代码来完成它,除了我在中概述的一些其他原因。

替换此代码

while (hAct == 0){
  continue;
}
…取而代之的是:

while (hAct == 0){
  try {
    Thread.yield();
  } catch (InterruptedException interruptedEx) {
    // Log the interruption somewhere.
  }
}
假设您在某种程度上使用AWT/Swing?这是一个无限循环,阻止其他线程运行。通过这样做,您永远不会让UI线程实际执行任何更新,这意味着它似乎挂起。您可能无法自己执行任何线程,但AWT/Swing附带了内置的线程来执行各种功能,它们需要定期获得CPU时间来完成工作

这在调试中起作用的原因是,调试器在您单步执行时暂停了
herostrn
方法,允许UI线程进行更新(包括从用户处获取输入),但在运行游戏时,
herostrn
方法从不暂停,这种方法占用了应用程序100%的可用CPU时间

最后,正如前面提到的,您通常不应该使用无限循环编写UI。而是定义触发事件的组件。您的代码将收到这些事件的通知并做出相应的反应。这就是所谓的UI事件模型。如果您使用的是Swing,请参阅有关在事件模型中工作的介绍性信息


我通常也不会在游戏中使用AWT/Swing,因为UI编码、渲染性能的复杂性,以及与AWT/Swing不是游戏的好工具这一事实相关的其他几个原因。话虽如此,基于回合的游戏可以通过这种方式很好地工作(因为渲染性能要求通常要低得多),如果你愿意钻研UI代码来完成它,除了我在中概述的一些其他原因。

我不是游戏程序员,所以这可能不是最好的方法,但是为什么不试着设置一个javax.swing.Timer,它每100毫秒运行一次呢。在计时器动作中,您可以