从动作监听器中启动游戏

时间:2012-05-11 20:25:04

标签: java swing event-handling actionlistener

我有一个用Java制作的二十一点游戏,我想通过点击一个按钮来指示游戏的开始。我的所有动作听众都可以正常工作,但问题在于我无法弄清楚如何在没有完全在actionPerformed方法中运行的情况下启动游戏。显然,在actionPerformed方法中连续运行的函数将有效地禁用我的其余GUI。这是一个代码片段....

go.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
                 // START GAME SOMEHOW but must run outside of action listener
        }
    });

3 个答案:

答案 0 :(得分:7)

  

显然,在actionPerformed方法中持续运行的函数将有效地禁用我的其余GUI。

这是一个有效的观察结果,表明您在使用Swing时已经理解了基本规则。

您的游戏最有可能是事件驱动的(如果我错了,请纠正我),因此按钮执行的操作应该只是将程序设置为新状态,等待进一步的事件。这不应该是耗时的,通常由EDT直接完成。

当然,如果你想做一个花哨的开始 - 新游戏动画,那需要在一个单独的线程中执行,在这种情况下你只需从内部启动动画线程(我建议使用SwingWorker) actionPerformed方法,然后返回。

在代码中,我想它看起来像这样:

go.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

        // Remove the menu components
        someJPanel.removeAll();

        // Show the game table
        someJPanel.add(new GamePanel());

        someJPanel.revalidate();
        someJPanel.repaint();

        // done. Wait for further user actions.
    }
});

答案 1 :(得分:1)

你的游戏应该从它自己的线程开始并自己管理(很难说),但为了让你继续你可以在一个新的“外部”线程中开始你的游戏,在你的actionPerformed:

public void actionPerformed(ActionEvent e) {
    Thread thread = new Thread("Game thread") {
        public void run() {
            startGame(); //or however you start your game
        }
    };
    thread.start();
}

答案 2 :(得分:1)

我相信你想延长javax.swing.SwingWorker

非ui启动功能将在doInBackground中运行,并且在完成更新ui时将调用done方法。

在javadoc类描述中甚至有一个示例来更新进度条,其中包含启动时发生的状态。