我在网上浏览了所有内容,但没有找到解决我问题的方法。对于一个AP Comp Sci项目,我正在制作一组游戏,这些游戏将从带有JButton的JFrame运行。我已经准备好所有游戏以及动作监听器,但是游戏无法正常启动。 JFrame和JButton也都正确设置。

private static class TetListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        GameCenter.quit();
        GameCenter.startTetris();
    }
}


GameCenter.quit()除了运行JFrame.dispose()和GameCenter.startTetris()之外什么也不做;构造一个新的Tetris对象,然后运行play()方法开始游戏。所有Tetris均已正确编码,并且可以在main方法(在ActionListener之外)中运行时正常工作。但是,一旦将其放入ActionListener中,就无法正确构建它。我将问题归结为:

public BlockDisplay(BoundedGrid<Block> board)
{
    this.board = board;

    grid = new JPanel[board.getNumRows()][board.getNumCols()];

    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.

    SwingUtilities.invokeLater(new Runnable()   // <<<<<<<<<<------------------- Problem Here
    {
        public void run()
        {
            createAndShowGUI();   // <<<<<<<<<<<<-------- Never Run

        }
    });

    //Wait until display has been drawn
    try
    {
        while (frame == null || !frame.isVisible())   // <<<<<<<-------- Never Resolved
        {
            Thread.sleep(1);
        }
    }
    catch(InterruptedException e)
    {
        e.printStackTrace();
        System.exit(1);
    }

}


因此,程序始终挂起。我还制作了一个使用此SwingUtilities.invokeLater的吃豆子游戏,因此也不起作用。我不知道为什么会这样或如何解决。

任何帮助表示赞赏。让我知道您是否需要更多信息。

最佳答案

如果运行SwingUtilities.invokeLater的线程已经是swing事件线程,并且您在此while循环中运行,是的,您的应用程序将挂起。

摆脱while循环。

07-24 19:30