调用方法时Java Swing GUI冻结

时间:2015-03-06 09:16:10

标签: java swing user-interface event-dispatch-thread

我对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是我的内部逻辑游戏板数组,redraw()有gui重绘(更新片段的位置),而restart()重启内部逻辑板到原始的游戏状态。 gui类是一个非常简单的摇摆gui,效果很好。问题是,在游戏循环中,当它是将死时,循环中断并且runner()函数结束。然后,用户应该能够按下gui中的新游戏按钮,以便在将死后重新开始游戏。新游戏按钮调用resetGame()。问题是,当再次调用runner()时,gui窗口会冻结,我不知道为什么,它不需要多个线程,我想。我有其他按钮调用我没有给你显示的函数,这些函数调用其他函数,如restart()等,它们没有问题,只有在调用runner()时才有。

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

由于

1 个答案:

答案 0 :(得分:3)

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

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.dispose();然后创建一个新的gui()实例并将其设置为visible()以在单击新游戏按钮时重新启动游戏