【问题标题】:Problems with ActionListener and SystemUtil.invokeLaterActionListener 和 SystemUtil.invokeLater 的问题
【发布时间】:2011-05-20 08:45:44
【问题描述】:

我浏览了整个网络,但没有找到解决问题的方法。对于 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 中,它就无法正确构造。我将问题追踪到:

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 游戏,所以它也不起作用。我无法弄清楚为什么会发生这种情况或如何解决它。

感谢任何帮助。如果您需要更多信息,请告诉我。

【问题讨论】:

  • public BlockDisplay(BoundedGrid&lt;Block&gt; board) 有没有被调用过?
  • 是的。俄罗斯方块可以完美运行,并且在 ActionListener 之外也应该如此。

标签: java swing actionlistener


【解决方案1】:

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

摆脱 while 循环。

【讨论】:

  • 好的,Pacman 已修复,但俄罗斯方块需要该循环存在,否则它会开始出现许多其他异常。有什么想法吗?
  • 如果 swing 准备好显示您的 GUI,您的游戏循环应该开始。你可以注册一个监听器,检查 JFrame/Frame 类
  • 抛出异常,因为 gui 还没有准备好,但是程序正在尝试使用 gui 的组件。所以他们抛出空指针异常。
  • 在没有看到更多示例代码和实际异常的情况下无法帮助您。使用一个事件监听器等待帧出现并从那里开始你的游戏逻辑
  • 好的,我明天会收集更多代码和异常并发布它们,并给事件监听器一个机会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多