调用方法时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 楼答案
您应该设置一个条件来控制循环,而不是将其设置为true。在这里,即使从resetGame()重置游戏,循环仍会继续运行;或者使用break
或者,作为一个快速解决方案,你可以简单地打电话给boardwindow。处置();然后创建gui()的新实例,并将其设置为visible(),以便在单击“新建游戏”按钮时重新启动游戏