我看了整个网络,发现我的问题无法解决。对于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游戏,所以它也不起作用。我无法弄清楚为什么会发生这种情况或如何解决它。
感谢任何帮助。如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
如果运行SwingUtilities.invokeLater
的线程已经是swing事件线程而你在这个while循环中运行,那么你的应用程序将会挂起。
摆脱while循环。