调用方法时Java Swing GUI卡住

标签 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 类是一个 swing gui,它非常简单,而且运行良好。问题是,在游戏循环中,当它被将死时,循环中断并且 runner() 函数结束。然后用户应该能够按下图形用户界面中的新游戏按钮,让游戏在将死后重新开始。新游戏按钮调用 resetGame()。问题是当再次调用 runner() 时 gui 窗口卡住,我不确定为什么,我认为它不需要多个线程。我还有其他按钮可以调用我没有向您展示的函数,这些函数调用其他函数,如 restart() 等,它们没有问题,只有在调用 runner() 时才会出现问题。

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

谢谢

最佳答案

您应该设置一个条件来控制循环而不是将其设置为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() 以在单击新游戏按钮时重新启动游戏

关于调用方法时Java Swing GUI卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28895576/

相关文章:

python - cx_freeze 中的 TCL_LIBRARY

java - 故意引发异常(Android with java)

java - 最好的 java 3D 饼图 API

java - 如何改变 JTextArea 中只有一个字符串的大小?

JAVA时间动画

java - 我应该创建一个新类来制作代码的 gui 吗?

java - 您如何为您的 Java Web 应用程序自动化 Javascript 缩小?

java - 在 Eclipse 中,是否可以在不更改源文件夹的情况下更改默认包?

java - 如何将 2 个 JButtons 放置在 JPanel 的顶部(一个居中,另一个位于右上角)?

windows - Windows Mobile应用程序的GUI测试工具