Я новичок в 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 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, игровой борд - это мой внутренний массив игровых карт, redraw() имеет переименование gui (для обновления позиций частей), а restart() перезапускает внутреннюю логическую плату до исходного начального игрового режима. Класс gui - это swing gui, который довольно прост и работает очень хорошо. Проблема заключается в том, что в игровом цикле, когда он мат, цикл прерывается и функция runner() заканчивается. Затем пользователь должен нажать кнопку новой игры в gui, чтобы перезапустить игру после матча. Новая кнопка игры вызывает resetGame(). Проблема в том, что окно gui зависает, когда runner() вызывается снова, и я не уверен, почему для этого не потребуется несколько потоков. У меня есть другие кнопки, которые вызывают функции, которые я вам не показывал, и эти функции вызывают другие функции, такие как 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(), чтобы перезапустить игру, когда нажата кнопка новой игры