Java Swing GUI зависает при вызове метода

1

Я новичок в 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().

Я знаю, что мой другой код, вероятно, ужасен в форматировании и согласии, но, пожалуйста, постарайтесь сосредоточить внимание на главной проблеме.

благодаря

  • 0
    Вы заметили какие-либо ошибки в журнале консоли?
  • 1
    Я не уверен в вашем случае, но почти все проблемы с зависанием GUI в Java Swing связаны с неправильным использованием EDT: docs.oracle.com/javase/tutorial/uiswing/concurrency/…
Показать ещё 5 комментариев
Теги:
user-interface
swing
event-dispatch-thread

1 ответ

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(), чтобы перезапустить игру, когда нажата кнопка новой игры

  • 0
    Какой цикл, в бегун или основной?
  • 0
    в бегун. или еще лучше посмотрите, как я могу использовать SwingWorker в Java? о том, как использовать качели для таких вещей, как это
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню