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