JButton застрял при нажатии (потому что я запускаю рекурсивную функцию в ActionListener) - PullRequest
0 голосов
/ 13 января 2019

Я делаю настольную игру в Java, и я хочу сделать кнопку запуска, чтобы начать игру. основная функция - это рекурсивная функция (gameloop), я вызываю эту функцию в ActionListener, и когда я нажимаю кнопку, она застревает.

ActionListener startListener = new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        gameFrame.remove(startB);
        gameFrame.add(boardPanel, gbc);
        gameFrame.revalidate();
        Game.gameLoop(); //the main recursive function
    }
};

Редактировать: я использовал SwingWorker, и он отлично работает, спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Попробуйте что-то вроде этого:

@Override
        public void actionPerformed(ActionEvent e) {

            gameFrame.remove(startB);
            gameFrame.add(boardPanel, gbc);
            gameFrame.revalidate();
            new Thread(){
                   public void run(){
                           Game.gameLoop(); //the main recursive function
                   }
            }.start();

        }
0 голосов
/ 13 января 2019

Это совершенно неправильный дизайн.

Прежде всего: actionPerformed() должен вызвать какое-то действие, но никогда не запускать игровой цикл. actionPerformed() должен вернуть как можно скорее: он не предназначен для выполнения сложных действий. В идеале поместите игровой цикл в собственный поток и реализуйте actionPerformed() таким образом, чтобы он передавал действия в игровой цикл и затем сразу возвращался.

Второе: игровой цикл должен быть реализован итеративно, а не как рекурсивная функция. (Вот почему он называется «игровой цикл», в первую очередь.) Нет смысла реализовывать его рекурсивно, так как игровые циклы имеют тенденцию работать довольно долго, а рекурсивная концепция будет потреблять все больше и больше стековой памяти и в какой-то момент потерпит неудачу. - и, как правило, довольно скоро.

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

...