Java 从动作监听器中启动游戏
我有一个用Java制作的21点游戏,我想通过点击一个按钮来表示游戏的开始。我所有的动作监听器都工作得很好,但问题在于,如果没有完全在actionPerformed方法中运行,我就不知道如何启动游戏。显然,在actionPerformed方法中连续运行的函数将有效地禁用GUI的其余部分。下面是一段代码片段Java 从动作监听器中启动游戏,java,swing,event-handling,actionlistener,Java,Swing,Event Handling,Actionlistener,我有一个用Java制作的21点游戏,我想通过点击一个按钮来表示游戏的开始。我所有的动作监听器都工作得很好,但问题在于,如果没有完全在actionPerformed方法中运行,我就不知道如何启动游戏。显然,在actionPerformed方法中连续运行的函数将有效地禁用GUI的其余部分。下面是一段代码片段 go.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e
go.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// START GAME SOMEHOW but must run outside of action listener
}
});
您的游戏可能应该从自己的线程开始,并自行管理(很难说),但为了让您继续,您可以从一个新的“外部”线程开始游戏,类似于您的actionPerformed中的以下内容:
public void actionPerformed(ActionEvent e) {
Thread thread = new Thread("Game thread") {
public void run() {
startGame(); //or however you start your game
}
};
thread.start();
}
显然,在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.
}
});
我相信你想要延长 非ui启动功能将在中运行,并在完成更新ui时调用该方法
在javadoc类描述中甚至有一个例子可以用启动时发生的事情的状态更新progressbar。游戏启动时做什么?它不应该有一个循环。所有的用户行为都应该是事件。我认为一个好的解决方案可能是不启动整个游戏,而只是发牌并返回。但是,我想知道如何从动作侦听器中启动程序。我想这是可能的,但我对Java和所有这些计算机都是新手。任何提示都将不胜感激!!!:)谢谢你的重播,JB。最初,我让它初始化一个新游戏,在它的构造函数中运行整个过程,因此actionPerformed方法只是有一句话:“game g=new game()”然而,现在你提到它应该只是一个事件,我更确信我做得不对。哈哈,我觉得这绝对是我应该做的。我要实现这个,看看它能把我带到哪里。我很惊讶这么快就得到这么多的回复。我真的很感谢大家的帮助!!!除非这是一个“每秒帧数”驱动/连续动画的应用程序,否则我认为启动一个单独的线程来运行游戏似乎是个坏主意。actionPerfomed应该只是调整用户界面,返回,然后等待进一步的用户操作。这就是我假设的,因为游戏运行没有返回,对我来说听起来不是很受事件驱动。