Java调用方法时Swing GUI冻结
Java Swing GUI Freezing When Calling Method
我是 Swing 的新手,但不是 Java。无论如何,我有一个国际象棋程序。这是游戏循环 class 中重要的部分:
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 class 是一个 swing gui,非常简单,而且运行良好。问题是,在游戏循环中,当它被将死时,循环中断并且 runner() 函数结束。然后用户应该能够按下图形用户界面中的新游戏按钮,让游戏在将死后重新开始。新游戏按钮调用 resetGame()。问题是当再次调用 runner() 时 gui window 冻结,我不确定为什么,我认为它不需要多个线程。我还有其他按钮可以调用我没有向您展示的函数,这些函数调用其他函数,如 restart() 等,它们没有问题,只有在调用 runner() 时才会出现问题。
我知道我的其他代码在格式和约定方面可能很糟糕,但请尽量让答案集中在主要问题上。
谢谢
您应该设置一个条件来控制循环,而不是将其设置为 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.dispose();然后创建一个新的 gui() 实例并将其设置为 visible() 以在单击新游戏按钮时重新启动游戏
我是 Swing 的新手,但不是 Java。无论如何,我有一个国际象棋程序。这是游戏循环 class 中重要的部分:
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 class 是一个 swing gui,非常简单,而且运行良好。问题是,在游戏循环中,当它被将死时,循环中断并且 runner() 函数结束。然后用户应该能够按下图形用户界面中的新游戏按钮,让游戏在将死后重新开始。新游戏按钮调用 resetGame()。问题是当再次调用 runner() 时 gui window 冻结,我不确定为什么,我认为它不需要多个线程。我还有其他按钮可以调用我没有向您展示的函数,这些函数调用其他函数,如 restart() 等,它们没有问题,只有在调用 runner() 时才会出现问题。
我知道我的其他代码在格式和约定方面可能很糟糕,但请尽量让答案集中在主要问题上。
谢谢
您应该设置一个条件来控制循环,而不是将其设置为 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.dispose();然后创建一个新的 gui() 实例并将其设置为 visible() 以在单击新游戏按钮时重新启动游戏