Java JButton在单击时卡住(因为我在ActionListener中启动了递归函数)

Java JButton在单击时卡住(因为我在ActionListener中启动了递归函数),java,loops,jbutton,actionlistener,Java,Loops,Jbutton,Actionlistener,我正在用java做一个棋盘游戏,我想做一个开始按钮来开始游戏。主函数是一个递归函数(gameloop),我在ActionListener中调用该函数,当我单击按钮时,它会卡住 ActionListener startListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { gameFrame.remove(startB); ga

我正在用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,它工作得很好,谢谢你的帮助

这是一个完全错误的设计

首先:
actionPerformed()
应该触发一些动作,但永远不要运行游戏循环
actionPerformed()
应尽快返回:它不用于执行复杂的操作。理想情况下,将游戏循环放入自己的线程中,并实现
actionPerformed()
,使其将动作传递给游戏循环,然后立即返回

第二:游戏循环应该迭代实现,而不是递归函数。(这就是为什么它首先被称为“游戏循环”)递归地实现它是没有意义的,因为游戏循环往往会运行很长时间,递归概念会消耗越来越多的堆栈内存,并在某个点失败,通常很快就会失败


我建议对您的软件进行彻底的重新设计。这样,您就不会在
JButton

上遇到任何问题,请尝试以下操作:

@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();

        }

你是否想启动一个游戏(单独的程序)来点击运行?那么,为什么不单独启动一个线程呢?在块上运行一个长进程。使用一个。要获得更多帮助,Swing UI通常不应该启动无限循环。相反,它应该对事件做出反应。这个游戏循环是做什么的?谢谢你的评论,但是现在除了游戏循环之外,一切都正常了,就像我没有写它一样。