我有一个用Java制作的二十一点游戏,我想通过点击一个按钮来指示游戏的开始。我的所有动作听众都可以正常工作,但问题在于我无法弄清楚如何在没有完全在actionPerformed方法中运行的情况下启动游戏。显然,在actionPerformed方法中连续运行的函数将有效地禁用我的其余GUI。这是一个代码片段....
go.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// START GAME SOMEHOW but must run outside of action listener
}
});
答案 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类描述中甚至有一个示例来更新进度条,其中包含启动时发生的状态。