Kei*_*mon 6 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
}
});
Run Code Online (Sandbox Code Playgroud)
显然,在actionPerformed方法中连续运行的函数将有效地禁用我的其余GUI.
这是一个有效的观察,表明您在使用Swing时已经理解了基本规则.
你的游戏最有可能是事件驱动的(如果我错了,请纠正我)所以按钮执行的操作应该只是将程序设置为新状态,等待进一步的事件.这不应该是耗时的,并且通常由EDT直接完成.
当然,如果你想做一个奇特的开始 - 新游戏动画,那需要在一个单独的线程中执行,在这种情况下你只需要在actionPerformed方法中启动动画线程(我建议使用SwingWorker) ,然后返回.
在代码中,我想它看起来像这样:
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.
}
});
Run Code Online (Sandbox Code Playgroud)
你的游戏可能应该在它自己的线程中启动并自行管理(很难说),但是为了让你继续,你可以在一个新的“外部”线程中启动你的游戏,在你的actionPerformed中像这样:
public void actionPerformed(ActionEvent e) {
Thread thread = new Thread("Game thread") {
public void run() {
startGame(); //or however you start your game
}
};
thread.start();
}
Run Code Online (Sandbox Code Playgroud)