我在网上浏览了所有内容,但没有找到解决我问题的方法。对于一个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循环。