有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

调用方法时Java Swing GUI冻结

我对Swing很陌生,但对Java不熟悉。不管怎样,我有一个象棋程序。下面是游戏循环类中重要的部分:

public class game {
    static Board gameboard = new Board();
    public static boolean waitstatus = true;
    public static char currentfaction = 'w';
    public static boolean done = false;
    public static boolean resigned = false;
    public static boolean wplayern = false;
    public static boolean bplayern = false;
    public static gui boardwindow = new gui();

    public static void main(String[] args) {
        gameboard.init(8, 8);
        gui.startGUI(boardwindow);
        runner();
        while (true) {
            //spin
        }

    }

    public static void runner() {
        done = false;
        resigned = false;
        wplayern = false;
        bplayern = false;
        boolean stalemate = false;

        while (true) {
            //The loop stuff    
        }
    }

    public static void resetGame() {
        if (!done) {
            System.out.println("Game's not finished yet!");
        } else {
            gameboard.restart();
            waitstatus = true;
            currentfaction = 'w';
            done = false;
            resigned = false;
            wplayern = false;
            bplayern = false;
            boardwindow.redraw();
            rerun();
        }
    }

    public static void rerun() {
        runner();
    }
}

这就是问题的代码。顺便说一句,boardwindow是一个gui对象,gameboard是我的内部逻辑gameboard数组,redraw()有gui重画(更新棋子的位置),restart()将内部逻辑板重新启动到原始的开始游戏状态。gui类是一个swing gui,它非常简单,工作也非常好。问题是,在游戏循环中,当它将死时,循环中断,runner()函数结束。然后,用户应该能够按下gui中的“新建游戏”按钮,以便在将死后重新启动游戏。新游戏按钮调用resetGame()。问题是当再次调用runner()时,gui窗口会冻结,我不知道为什么,我想这不需要多个线程。我还有其他按钮,它们调用我没有向您展示的函数,这些函数调用其他函数,比如restart()等等,它们没有问题,只有在调用runner()时才有问题

我知道我的其他代码在格式和惯例方面可能很糟糕,但请尽量把答案集中在主要问题上

谢谢


共 (1) 个答案

  1. # 1 楼答案

    您应该设置一个条件来控制循环,而不是将其设置为true。在这里,即使从resetGame()重置游戏,循环仍会继续运行;或者使用break

    public static void runner() {
        done = false;
        resigned = false;
        wplayern = false;
        bplayern = false;
        boolean stalemate = false;
    
        while (true) {
            //The loop stuff 
            if(newGameClicked == true){//just to literally make meaning
                break;
            }
        }
    }
    

    或者,作为一个快速解决方案,你可以简单地打电话给boardwindow。处置();然后创建gui()的新实例,并将其设置为visible(),以便在单击“新建游戏”按钮时重新启动游戏