2

我正在用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 摆动框架的移动的游戏,这在我的代码中不存在。

任何帮助将不胜感激。

4

1 回答 1

4

您有几个循环,例如

while(!(I.getBool())){}

I如果没有按预期响应,它可能会永远运行。您可以首先在这些循环中打印一些内容,然后在以下块if(I.getBool()){...}中查看您的应用程序在什么时候卡住了。

像这样在循环中检查用户界面不是好的做法。最好使用监听器来响应用户界面。

使用 也不会在 Swing 线程上运行主应用程序SwingUtilities.invokeLater(new Runnable(),即使它避免了从另一个线程更新 GUI 的潜在问题。

事实上,这可能是您的根本问题,因为像这样在 Swing 线程(用于运行 GUI 的线程)上运行主应用程序循环可能会阻止 GUI 正确响应。您正在将一个任务(整个游戏)放到 GUI 的队列中,但该任务永远不会完成while(!(G.isGameOver()))

于 2012-09-20T22:52:05.847 回答