ActionListener和SystemUtil.invokeLater的问题

时间:2011-05-20 00:30:15

标签: java swing actionlistener

我看了整个网络,发现我的问题无法解决。对于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()之外什么都不做;构造一个新的俄罗斯方块对象,然后运行play()方法来启动游戏。所有俄罗斯方块都经过正确编码,并且在主方法(在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的Pacman游戏,所以它也不起作用。我无法弄清楚为什么会发生这种情况或如何解决它。

感谢任何帮助。如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

如果运行SwingUtilities.invokeLater的线程已经是swing事件线程而你在这个while循环中运行,那么你的应用程序将会挂起。

摆脱while循环。