我正在用java编写一个国际象棋游戏,目前我正在构建一个基本的界面。它只是一个将显示在窗口中的 8x8 按钮数组。我已经对这些按钮进行了编码,并且已经使面板正确显示。然而,当我将其与游戏的其余部分连接时,游戏窗口在运行时崩溃,我必须强制退出 java 应用程序。这是我的代码:
package Chess_Game;
import javax.swing.SwingUtilities;
import Chess_Interface.Iboard;
public class Game_Tester
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Game G = new Game();
Iboard I = new Iboard(G.getBoard().getArray(), G.getSides());
I.setVisible(true);
while(!(G.isGameOver()))
{
boolean redo = true;
while(redo)
{
int row = 0;
int col = 0;
int nRow = 0;
int nCol = 0;
System.out.println("Click the piece you want to move.");
while(!(I.getBool())){}
if(I.getBool())
{
row = I.getRow();
col = I.getCol();
I.setBool(false);
}
System.out.println("Click the place you want to move to.");
while(!(I.getBool())){}
if(I.getBool())
{
nRow = I.getRow();
nCol = I.getCol();
I.setBool(false);
}
if(G.canMove(row, col, nRow, nCol))
{
G.move(row, col, nRow, nCol, I);
redo = false;
}
else
{
System.out.println("You cant move there! Try again!");
}
}
I.updateBoard(G.getBoard().getArray(), G.getSides());
}
}
});
}
}
当我注释掉主 while 循环(及其内部的所有内容)时,该板会正确显示,并且我认为问题出在其中的某个地方,但我一直无法找到它。我也在网上查找过类似的游戏循环问题,但所有这些问题都是针对涉及帧速率和跨 java swing 框架的移动的游戏,而我的代码中不存在这些问题。
任何帮助将不胜感激。
最佳答案
你有几个循环,例如
while(!(I.getBool())){}
如果I
没有按预期响应,它可能会永远运行。您可以首先在这些循环中打印一些内容,并在以下 block if(I.getBool()){...}
中打印一些内容,以查看应用程序在什么时候卡住。
像这样循环检查用户界面并不是一个好习惯。最好使用Listeners响应用户界面。
也不是使用 SwingUtilities.invokeLater(new Runnable()
) 在 Swing 线程上运行主应用程序,尽管它避免了从另一个线程更新 GUI 的潜在问题。
事实上,这可能是您的根本问题,因为在 Swing 线程(用于运行 GUI 的线程)上运行主应用程序循环可能会阻止 GUI 正确响应。您正在将一个任务(整个游戏)放入 GUI 队列中,但该任务永远不会完成 while(!(G.isGameOver()))
。
关于Java Swing Frame 在打开时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522006/